2008-11-21 11 views

Respuesta

66

encontrado la respuesta a mí mismo.

Richard Dingwall tiene un excelente post va a través de diversas estrategias. Me gusta particularmente la solución FilterAttribute. No soy un fan de lanzar excepciones en torno queramos o no, así que voy a ver si puedo mejorar en eso :)

Para el Global.asax, sólo tiene que añadir este código como su última ruta para registrar:

routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "StaticContent", action = "PageNotFound" } 
    ); 
+6

He intentado esto, pero no funciona. He puesto la ruta debajo de mi ruta predeterminada, pero sigo recibiendo errores 404. – Martijn

+0

Hmm. creo que funciona para mi –

+0

¿Puede explicar qué es exactamente lo que tengo que asumir? Soy muy nuevo en MVC. – Tanmoy

3

Esto podría ser un problema cuando se utiliza

throw new HttpException(404); 

cuando se desea capturar eso, no sé de ninguna otra manera a continuación, la edición de su web.config.

+0

ActionFilters: úsalos para capturar la HttpException. –

+0

¿Qué sucede si la acción del controlador no arroja la excepción? Lanzo un 404 en mi fábrica de controladores. – Paco

+0

No estoy seguro, entonces, no estoy jugando con fábricas de controladores. soz. –

17

Esta pregunta fue primero, pero la respuesta más fácil se produjo en una pregunta posterior:

Routing for custom ASP.NET MVC 404 Error page

I got my error handling to work by creating an ErrorController that returns the views in this article. I also had to add the "Catch All" to the route in global.asax.

I cannot see how it will get to any of these error pages if it is not in the Web.config..? My Web.config had to specify:

customErrors mode="On" defaultRedirect="~/Error/Unknown" 

and then I also added:

error statusCode="404" redirect="~/Error/NotFound" 

Hope this helps.

Me encanta esta manera ahora porque es muy simple:

<customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect"> 
    <error statusCode="404" redirect="~/Error/PageNotFound/" /> 
</customErrors> 
+0

Eso es lo que tengo ahora, pero estoy tratando de reemplazarlo con una solución mejor que no envíe primero una respuesta 302 al cliente, sino un 404 directamente. Cambia el modo redirectMode a ResponseRewrite y verás que ya no funciona ... :-( –

+2

@LouisSomers Desde esta respuesta, he encontrado que la mejor manera es la descrita en esta pregunta: http://stackoverflow.com/questions/1171035/asp-net-mvc-custom-error-handling-application-error-global-asax Prefiero no redirigir al usuario a una URL diferente porque es menos fácil de usar (incluso me resulta molesto mientras desarrollo). Cheers. – smdrager

+0

Recibo el error 'Error de configuración: la sección de configuración 'customErrors' no se puede leer porque falta una declaración de sección'. – alex

2

Añadir estas líneas bajo el proyecto del archivo raíz web.config.

<system.webServer> 
<httpErrors errorMode="Custom" existingResponse="Replace"> 
    <remove statusCode="404" /> 
    <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" /> 
    <remove statusCode="500" /> 
    <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" /> 
</httpErrors> 
<modules> 
    <remove name="FormsAuthentication" /> 
</modules> 

0

Si la ruta no se puede resolver, entonces framework MVC voluntad a través de error 404 .. mejor enfoque consiste en utilizar filtros de excepción ... Crear un exceptionfilter personalizada y hacer como esto ..

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter { 
    public void OnException(ExceptionContext filterContext) { 
     filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html"); 
    } 
} 
0

Dentro RouterConfig.cs añadir la pieza follwing de código:

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

      }); 
3

también se puede manejar no ha encontrado un error en la siguiente Global.asax.cs

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception lastErrorInfo = Server.GetLastError(); 
    Exception errorInfo = null; 

    bool isNotFound = false; 
    if (lastErrorInfo != null) 
    { 
     errorInfo = lastErrorInfo.GetBaseException(); 
     var error = errorInfo as HttpException; 
     if (error != null) 
      isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound; 
    } 
    if (isNotFound) 
    { 
     Server.ClearError(); 
     Response.Redirect("~/Error/NotFound");// Do what you need to render in view 
    } 
} 
Cuestiones relacionadas