Ruta predeterminada para todas las situaciones extremas
-
11-07-2019 - |
Pregunta
En mi ruta me gustaría tener algo como controlador de ruta no encontrado.
Por ejemplo, he creado una asignación como
routes.MapRoute(
"default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id="" }
);
routes.MapRoute(
"Catchall",
"{*catchall}",
new { controller = "Home", action = "Lost" }
);
pero cuando el usuario inserta direcciones como / uno / dos / tres / cuatro / bla / bla, se almacenará en caché con la asignación de Catchall.
Pero cuando el usuario inserta algo que debería coincidir con la asignación predeterminada, (como / one / two /, pero este controlador o acción no está implementado) Me gustaría que la asignación de Catchall acepte esta solicitud, porque todas las otras asignaciones fallaron. Pero en lugar de esto me sale un error.
¿Debo anular algunos manejadores de mapeo para detectar la excepción si el controlador o la acción obtienen una excepción?
Solución
El problema aquí es que no es responsabilidad de la ruta asegurarse de que "uno / dos" se asigna a un archivo . Esa responsabilidad recae en ViewEngine. Desde " uno / dos " es una ruta válida, se elegirá.
Si desea manejar el error de una ruta no válida, lo que le recomendaría que haga es simplemente usar la página integrada ErrorHandling " para mostrar cualquier mensaje que hubieras hecho en Catchall.
Otros consejos
No creo que esta sea la mejor solución, pero siempre podría ser más específico en sus rutas:
routes.MapRoute(
"home and action",
"home/index/{id}",
new { controller = "Home", action = "Index", id="" }
);
... repite para el resto de tus acciones ...
routes.MapRoute(
"article catch all",
"home/{article}",
new { controller = "Home", action = "ArticleSearcher", article="" }
);
Esto intentaría hacer coincidir una acción directa, y si no se encuentra ninguna acción, pase lo que normalmente sería la parte {action} de la ruta predeterminada a la acción 'ArticleSearcher' como un parámetro de cadena de artículo.
La desventaja es tener que crear explícitamente cada ruta de controlador / acción.