2011-06-02 20 views
11

En mi web.config, tengo:no puede conseguir que funcione defaultRedirect

<system.web> 
    <customErrors mode="On" defaultRedirect="Error.cshtml" /> 
</system.web> 

En Vistas/Shared/Error.cshtml, tengo:

@model System.Web.Mvc.HandleErrorInfo 
@{ 
    ViewBag.Title = "Error"; 
} 
<h2> 
    Sorry, an error occurred while processing your request. 
</h2> 

Si pongo un inválido URL/ruta a mi navegador, obtengo esto:

Error del servidor en la aplicación '/'.

No se puede encontrar el recurso.

Descripción: HTTP 404. El recurso que está buscando (o una de sus dependencias) podría haberse eliminado, haber cambiado su nombre o no estar disponible temporalmente. Revise la siguiente URL y asegúrese de que esté escrita correctamente.

URL solicitada: /Error.cshtml

¿Por qué no puede ser encontrado Error.cshtml? El archivo definitivamente está en Views/Shared.

+0

duplicado posible de [Cómo hacer que las páginas de error personalizadas trabajan en ASP.NET MVC 4] (http://stackoverflow.com/questions/13905164/how-to-make-custom-error-pages -work-in-asp-net-mvc-4) – Liam

+0

La respuesta es aplicable a MVC3 así como a 4^ – Liam

Respuesta

7

El valor predeterminado de Redirect no irá directamente a una vista. Su defaultRedirect se parece a un archivo de vista de afeitar que no puede procesar. Por ejemplo: ¿De dónde saca el modelo? No se especifica ni se puede especificar en el archivo de configuración, por lo que no puede procesar una vista.

Si desea páginas de error más dinámicos en MVC es posible que desee leer custom error pages and error handling in MVC 3

+0

Su respuesta contradice esta respuesta: http://stackoverflow.com/a/13905859/507339. De mi prueba, en realidad experimento que el framework ha inyectado un modelo de tipo HandleErrorInfo. Es posible que deba soltar la extensión ".cshtml" en web.config aunque – Nilzor

+0

@Colin - Si un controlador de error global está registrado en FilterConfig (por ejemplo, filters.Add (new HandleErrorAttribute());) no debería haber ningún problema. No existe un requisito 1: 1 para que exista un controlador para una vista. Es solo así por convención. – Matt

2

Usted debe marcar su acción del controlador con [HandleError] atributo o registrarlo como un filtro global

EDIT: Sucede debido a errores personalizados redirige funcionalidad pertenece a la infraestructura de ASP.NET y no sabe nada de ASP. NET MVC.

Debe crear un controlador por separado para administrar los redireccionamientos y especificar la URL en su Web.config. O bien, puede crear un archivo html estático y ponerlo en el directorio raíz (o en cualquier otro lugar excepto en el directorio Vistas)

+0

No hace la diferencia ... todavía dice que no puede encontrar Error.cshtml. ¿Y qué sucede si el usuario ingresa una URL que ni siquiera contiene un controlador válido? – devuxer

+0

Ah, ahora lo entiendo. Debe crear un controlador por separado para administrar las redirecciones y especificar la url en su Web.config. O bien, debe crear un archivo html estático y no ponerlo en la carpeta Vistas – xelibrion

1

Una solución es crear ErrorController

public class ErrorController : Controller 
{ 
    // 
    // GET: /Error/ 

    public ActionResult Error() 
    { 
     return View(); 
    } 

    public ActionResult Error404() 
    { 
     return View("Error"); 
    } 

} 

Cambio Web.config

3

Editar usted web.config como:

<system.web> 
    <customErrors mode="On" defaultRedirect="/Home/Error" /> 
</system.web> 

Si utiliza asp.net mvc 1.0 o 2.0, se debe añadir el atributo HandleError para cada controlador:

[HandleError] 
public class HomeController: Controller 
{ 
    public ActionResult Error() 
    { 
     return View(); 
    } 
} 

si utiliza asp.net mvc 3.0:

public class MvcApplication : System.Web.HttpApplication 
{ 
     protected void Application_Start() 
     { 
      GlobalFilters.Filters.Add(new HandleErrorAttribute()); 
     } 
} 
+0

Gracias, pero esto no funciona. Aparece un error de "recurso no encontrado" para/Inicio/Error. Estoy usando ASP.NET MVC 3, y ya estaba agregando el filtro 'HandleErrorAttributes'. – devuxer

+0

¿Tiene el nombre de vista "Error" en/your-web-root/Views/Home /? – hellangle

+0

¿No necesitarías el ~, como en la respuesta de Rajesh? Yo si. – Dronz

5

funciona para mi. Solo haz este cambio en la web.config:

<system.web> 
    <customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> 
    </customErrors> 
</system.web> 
+0

Esto casi funcionó para mí. Sin embargo, tuve que soltar el .cshtml: defaultRedirect = "~/Public/Error" es lo que necesitaba. – Dronz

Cuestiones relacionadas