Пара ошибок при попытке использовать пользовательские ошибки в MVC 2 - PullRequest
1 голос
/ 23 апреля 2011

Я получаю пару ошибок при попытке использовать пользовательские страницы ошибок 404 и 500 в MVC 2. По сути, я пытаюсь реализовать то, что я нашел здесь: http://www.genericerror.com/blog/2009/01/27/ASPNetMVCCustomErrorPages.aspx Пока у меня есть:

Поместил следующую строку в мой Web.config:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Http500" />

Поместил следующий маршрут последний в мою таблицу маршрутов:

routes.MapRoute(
    null,
    "{*path}",
    new { controller = "Error", action = "Http404" }
);

И создал следующий контроллер:

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

    public ActionResult Http500()
    {
        Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        return View("my500");
    }

    //
    // GET: /Error/Http404/Path

    public ActionResult Http404(string path)
    {
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View("my404", path);
    }
}

При всех этих 500 ошибках, представление my500 не отображается.Вместо этого, похоже, что снова отображается стандартное представление Error.aspx по умолчанию.Для 404 ошибок я получаю YSOD, говорящий мне включить пользовательские ошибки в моем Web.config.Я не уверен, что мне не хватает, или я даже на правильном пути.

РЕДАКТИРОВАТЬ: Оба представления находятся в представлениях / общий доступ

1 Ответ

1 голос
/ 25 апреля 2011

С ошибками Http 500 вы, вероятно, получаете страницу по умолчанию, поскольку к контроллеру применен атрибут HandleError. Вы можете указать представление в атрибуте HandleError для типа ошибки, который вы хотели бы указать, но не очень хорошо разработан для обработки HttpException с. Если вы удалите этот атрибут из вашего контроллера, то по умолчанию должен использоваться материал asp.net. Вы также можете просто переопределить OnException в вашем базовом контроллере.

При ошибках Http 404 возникает перегрузка для return View(string, string);, которую вы непреднамеренно используете. Приведите путь как объект (meh) или используйте именованные параметры (ура), и он будет использовать путь в качестве модели для вашего представления. Сейчас он думает, что это имя главной страницы, которую вы хотите использовать.

Это сложная проблема, и вы также можете найти больше информации здесь .


Немного придирка, но я также HIGHLY рекомендую устанавливать только Response.StatusCode в методе .Execute() класса, который наследует ActionResult. Концептуально, результатом действия является часть кода, которая должна формировать ответ, а реализация части этого за пределами ActionResult, как вы делаете здесь, в своем контроллере, склонна к очень трудным поискам ошибок. Я знаю, что HttpStatusCodeResult, поставляемый с MVC2, не позволяет вам выбрать представление, которое будет возвращаться вместе с результатом, но довольно просто бросить ваше собственное наследование от ViewResult.

...