tutorial que net mvc microsoft framework espaƱol asp asp.net-mvc asp.net-mvc-2

que - ASP.NET MVC: captura todas las rutas y rutas predeterminadas



microsoft asp.net mvc 2 que es (8)

Usar restricciones de ruta

En su caso, debe definir su ruta predeterminada {controller}/{action}/{id} y ponerle una restricción. Probablemente relacionado con nombres de controladores o incluso acciones. A continuación, coloque la captura una después y debería funcionar bien.

Entonces, cuando alguien solicite un recurso que falla una restricción, la ruta general coincidirá con la solicitud.

Asi que. Defina primero su ruta predeterminada con restricciones de ruta y luego la ruta para capturar todas las siguientes:

routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { controller = "Home|Settings|General|..." } // this is basically a regular expression ); routes.MapRoute( "NotFound", "{*url}", new { controller = "Error", action = "PageNotFound" } );

Al intentar que mi aplicación produzca errores 404 correctamente, implementé una ruta catch all al final de mi tabla de rutas, como se muestra a continuación:

routes.MapRoute( "NotFound", _ "{*url}", _ New With {.controller = "Error", .action = "PageNotFound"} _ )

Sin embargo, para que esto funcionara, tuve que eliminar la ruta predeterminada:

{controller}/action/{id}

Pero ahora que se ha eliminado el valor predeterminado, la mayoría de mis enlaces de acción ya no funcionan, y la única forma que encontré para que funcionen de nuevo es agregar rutas individuales para cada controlador / acción.

¿Hay una forma más sencilla de hacerlo, en lugar de agregar una ruta para cada controlador / acción?

¿Es posible crear una ruta predeterminada que aún permita que la captura de todas las rutas funcione si el usuario intenta navegar a una ruta desconocida?


Ah, el problema es que la ruta predeterminada captura los 3 URL del segmento . El problema aquí es que el enrutamiento se ejecuta mucho antes de que determinemos quién va a manejar la solicitud. Por lo tanto, cualquier URL de tres segmentos coincidirá con la ruta predeterminada, incluso si termina más tarde y no hay un controlador para manejarlo.

Una cosa que puede hacer es en su controlador anular el método HandleMissingAction. También debe utilizar la etiqueta para detectar todos los problemas 404.


Bueno, lo que he encontrado es que no hay una buena manera de hacer esto. He establecido la propiedad redirectMode de customErrors en ResponseRewrite .

<customErrors mode="On" defaultRedirect="~/Shared/Error" redirectMode="ResponseRewrite"> <error statusCode="404" redirect="~/Shared/PageNotFound"/> </customErrors>

Esto me da el comportamiento deseado, pero no muestra la página formateada.

Para mí esto está mal hecho, en lo que se refiere a SEO. Sin embargo, siento que hay una solución que me falta, ya que SO hace exactamente lo que quiero que suceda. La URL permanece en la página fallida y lanza un 404. Inspeccione .com/fail en Firebug.


Mi solución es 2 pasos.

Originalmente resolví este problema agregando esta función a mi archivo Global.asax.cs:

protected void Application_Error(Object sender, EventArgs e)

Donde intenté convertir Server.GetLastError () en una HttpException y luego verifiqué GetHttpCode. Esta solución se detalla aquí:

ASP.NET MVC Custom Error Handling Application_Error Global.asax?

Esta no es la fuente original donde obtuve el código. Sin embargo, esto solo detecta los errores 404 que ya se han enrutado. En mi caso, esa es cualquier URL de 2 niveles.

por ejemplo, estas URL mostrarían la página 404:

www.site.com/blah

www.site.com/blah/blah

sin embargo, www.site.com/blah/blah/blah simplemente diría que no se pudo encontrar la página. Agregando su ruta de captura todas DESPUÉS de que todas mis otras rutas resolvieron esto:

routes.MapRoute( "NotFound", "{*url}", new { controller = "Errors", action = "Http404" } );

Sin embargo, la ruta NotFound no parece enrutar las solicitudes que tienen extensiones de archivo. Esto funciona cuando son capturados por diferentes rutas.


Probablemente sea mejor configurar el documento de error 404 en la sección de configuración y luego restaurar la ruta predeterminada.

FWIW, creo que el requisito de la ruta predeterminada también se retrasa.


Recomendaría esta como la versión más legible. Lo necesita en su RouteConfig.cs y un controlador llamado ErrorController.cs, que contiene una acción ''PageNotFound''. Esto puede devolver una vista. Cree un PageNotFound.cshtml y se devolverá en respuesta al 404:

routes.MapRoute( name: "PageNotFound", url: "{*url}", defaults: new { controller = "Error", action = "PageNotFound" } );

Cómo leer esto:

name: "PageNotFound"

= crear una nueva plantilla de ruta, con el nombre arbitrario ''PageNotFound''

url:"{*url}"

= usa esta plantilla para mapear todas las rutas no manejadas

defaults: new { controller = "Error", action = "PageNotFound" }

= definir la acción a la que se asignará una ruta incorrecta (el método de acción ''PageNotFound'' en el controlador de errores). Esto es necesario ya que, obviamente, una ruta ingresada incorrectamente no se asignará a ningún método de acción



//this catches all requests routes.MapRoute( "Error", "{*.}", new { controller = "PublicDisplay", action = "Error404" } );

Añade esta ruta al final de la tabla de rutas.