2014-02-20 3 views
0

Я хочу создать страницу пользовательских ошибок для моего проекта MVC4 с помощью моей собственной модели.Пользовательские ошибки для MVC4

Я использовал подход от Darin Димитрова из Custom error pages on asp.net MVC3

Теперь я хотел использовать свою собственную (тест) модель:

public class ErrorModel 
{ 
    public string message { get; set; } 
} 

Теперь, когда я использую режим CustomErrors = «Off» все работает отлично, но только на локальной машине. Когда я обращаюсь к машине с удаленной машины, отображается ошибка по умолчанию. (Что предполагаемый путь - я думаю)

Теперь, когда я устанавливаю система внезапно ожидает свою собственную модель, а не мой:

«Модель элемент передается в словарь типа«System.Web.Mvc .HandleErrorInfo ', но для этого словаря требуется элемент модели типа Project.Controllers.ErrorModel.

Как я могу заставить систему отображать страницу через customErrors = «Выкл.» В удаленной системе, когда режим Off или как заставить его использовать мою модель вместо модели HandleErrorInfo?

My ErrorController

public class ErrorController : Controller 
{ 
    public ActionResult General(Exception exception) 
    { 
     var viewModel = new ErrorModel() 
     { 
      message = exception.Message   
     }; 
     return View(viewModel); 
} 

Взгляд:

@model SRMv2.WebUI.Controllers.ErrorModel 
@{ 
} 
@Html.Raw(Model.message) 

И в Global.asax

protected void Application_Error() 
{ 
    HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
    HttpContext.Current.Response.Cache.SetValidUntilExpires(false);   HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    HttpContext.Current.Response.Cache.SetNoStore(); 

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

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

Почему customErrors = "Off" показывает ваши сообщения об ошибках? Может быть, проблема где-то еще. – user1477388

+0

Потому что я вызываю ErrorController в глобальном.asax на Application_Error, см .: http://stackoverflow.com/questions/5226791/custom-error-pages-on-asp-net-mvc3 – Vulcano

ответ

1

Что происходит, что ваш код обработки ошибок бросает необработанное исключение, которое затем пойманную по умолчанию обработчик aspnet. Если вы вообще не видите представление, которое вы используете для отображения страницы с ошибкой, я предполагаю, что вы не изменили тип модели там, чтобы соответствовать набору модели в вашем контроллере.

+0

Очень хорошее предположение, интересно узнать, правильны ли вы. – user1477388

+0

Хм, тогда это не имеет никакого смысла. Потому что он работает, когда CustomErrors переключаются на Off. Думаю, я добавлю весь код выше. Возможно, это очищает его – Vulcano

0

maf748 Вы были совершенно правы в своем ответе. Интересно, почему это произошло.

Когда customError отключен, MVC-инфраструктура вызывает Application_Error() в global.asax, вызывается ErrorController (см. Вопрос). Когда вы переключаете customError на On MVC framework, отлично, пользователь имеет дело с Exception, находит View и визуализирует его, без правильного вызова ErrorController. Поэтому он не смог отобразить viewmodel, и был использован стандартный viewModel (System.Web.Mvc.HandleErrorInfo).

Таким образом, представления не совпадают, фреймворк поднял Application_Error() и Server.GetLastError(), возвращенные, что модели viewmodels не совпадали ... что правильно, а затем ErrorController/View генерируется с этой ошибкой ...

Итак, мое решение?

Вызовите ErrorController OnActionExecuted()

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 

     if (filterContext.Exception != null) 
     { 
      filterContext.ExceptionHandled = true; 
      IController errorController = new ErrorController(); 
      var routeData = new RouteData(); 
      routeData.Values["controller"] = "Errors"; 
      routeData.Values["action"] = "General"; 
      routeData.Values["exception"] = filterContext.Exception; 

      var rc = new RequestContext(filterContext.HttpContext, routeData); 
      errorController.Execute(rc); 
     } 

Еще раз спасибо за установление меня на правильном пути, как большая часть материала, описанного скрывается за рамки.

Смежные вопросы