Изменить папку просмотра по умолчанию для пользовательской страницы ошибки Http404

Я хочу настроить страницы ошибок на моем веб-сайте asp.net mvc3.

Итак, я нашел этот очень полезный пост: Пользовательские страницы ошибок на asp.net MVC3 и это работает хорошо

Однако мой файл Http404.cshtml не находится в папке по умолчанию Views. Он находится в папке с именем BaseViews. У меня уже есть _Layout.cshtml и другие представления или частичные представления в этой папке.

Эта папка не проверяется по умолчанию ViewEngine (он проверяет только папку Views и всю папку views моего Areas). Итак, я использую ViewEngineExtension и добавляю его в коллекцию System.Web.Mvc.ViewEngines в файле Application_Start() моего Global.asax. Все мои приложения работают отлично и могут получить доступ к моему макету и другим BaseViews материалам.

Я не могу сказать то же самое о Application_Error() Global.asax. Этот метод игнорирует предыдущий механизм представления и просматривает только папку представления по умолчанию. Я попытался добавить свой ViewEngineExtension в метод Application_Error() вот так ViewEngines.Engines.Add(new BaseViewsEngineExtension());, но это ничего не меняет. Это точно такая же строка, которую я использую в Application_Start().

Смотрите мой код для Application_Error():

protected void Application_Error()
{
    var exception = Server.GetLastError();
    var httpException = exception as HttpException;
    Response.Clear();
    Server.ClearError();
    var routeData = new RouteData();
    routeData.Values["controller"] = "Error";
    routeData.Values["action"] = "Index";
    routeData.Values["exception"] = exception;
    Response.StatusCode = 500;
    if (httpException != null)
    {
        Response.StatusCode = httpException.GetHttpCode();
        switch (Response.StatusCode)
        {
            case 404:
                routeData.Values["action"] = "Http404";
                break;
        }
    }

    IController errorController = new ErrorController();
    var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
    errorController.Execute(rc);
}

Мой вопрос: как я могу заставить движок просмотра errorController.Excecute(rc) искать мое представление Http404.cshtml в папке BaseViews?


person Florent Henry    schedule 01.08.2012    source источник


Ответы (2)


Как сказал SLaks, вы должны вернуть полный путь к вашему представлению в вашем ErrorController.

  public class ErrorController : Controller
  {
      public ActionResult Http404()
      {
          return View("~/BaseViews/Error/Http404.cshtml");
      }
  }

Но это не сработает, потому что ваша ошибка переопределена, поэтому вы не получите ожидаемого результата. Чтобы обойти эту проблему, вы можете сказать своему приложению, что все в порядке в вашем application_error следующим образом:

Request.StatusCode = 200;

Я надеюсь, что это решит вашу проблему.

person Jordan Gueguen    schedule 02.08.2012
comment
Я до сих пор не знаю, как определить механизм представления в Application_error, но это не имеет значения. Изменение StatusCode на 200 помогло, спасибо. - person Florent Henry; 02.08.2012

Измените действие Http404, чтобы вернуть полный путь к его представлению.

person SLaks    schedule 01.08.2012
comment
Я не уверен, что понимаю, что вы имеете в виду? Можете ли вы быть более конкретным, пожалуйста? - person Florent Henry; 01.08.2012