Не удается заставить defaultRedirect работать

В моем web.config у меня есть:

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

В Views/Shared/Error.cshtml у меня есть:

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

Если я помещаю неверный URL/маршрут в свой браузер, я получаю следующее:

Ошибка сервера в приложении "/".

Ресурс не найден.

Описание: HTTP 404. Ресурс, который вы ищете (или его зависимости), мог быть удален, изменилось его имя или временно недоступно. Просмотрите следующий URL-адрес и убедитесь, что оно написано правильно.

Запрошенный URL:/Error.cshtml

Почему невозможно найти Error.cshtml? Файл определенно находится в представлениях/общих.

Ответ 1

DefaultRedirect не переходит непосредственно к представлению. Ваш defaultRedirect выглядит как файл просмотра бритвы, который он не может обработать. Например: откуда она взяла модель? Он не может быть указан и не может быть указан в файле конфигурации, поэтому он не может обрабатывать представление.

Если вы хотите больше страниц с динамической ошибкой в ​​MVC, вы можете читать настраиваемые страницы ошибок и обработку ошибок в MVC 3

Ответ 2

Это работает для меня. Просто внесите это изменение в web.config:

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

Ответ 3

Отредактируйте файл web.config как:

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

Если вы используете asp.net mvc 1.0 или 2.0, вы должны добавить атрибут HandleError для каждого контроллера:

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

если вы используете asp.net mvc 3.0:

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

Ответ 4

Вы должны отметить действие вашего контроллера атрибутом [HandleError] или зарегистрировать его как глобальный фильтр

EDIT: Это происходит из-за того, что функция перенаправления пользовательских ошибок принадлежит инфраструктуре ASP.NET и ничего не знает о ASP.NET MVC.

Вы должны создать отдельный контроллер для управления переадресацией и указать URL-адрес в своем Web.config. Или вы можете создать статический html файл и поместить его в корневой каталог (или где бы то ни было, кроме каталога Views)

Ответ 5

Одним из решений является создание ErrorController

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

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

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

}

Измените Web.config