System.Web.Mvc.HandleErrorInfo неправильный тип модели

#asp.net-mvc-3

#asp.net-mvc-3

Вопрос:

я создаю правильный тип модели и не понимаю, откуда это берется. есть идеи?

Система.Исключение InvalidOperationException: элемент модели, переданный в словарь, имеет тип 'System.Web.Mvc.HandleErrorInfo', 
но для этого словаря требуется элемент модели типа 'BusinessLogic.Models.Ошибка CodeModel'.
 в System.Web.Mvc.ViewDataDictionary`1.setModel(значение объекта)
 в System.Web.Mvc.ViewDataDictionary..ctor (словарь ViewDataDictionary)
 на System.Web.Mvc.WebViewPage`1.Установите viewviewdata(ViewDataDictionary ViewData)
 в System.Web.Mvc.RazorView.RenderView(viewContext viewContext, средство записи текста, экземпляр объекта)
 в System.Web.Mvc.ViewResultBase.Результат выполнения (контекст ControllerContext)
 в System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext ControllerContext, строковое имя действия)
 в System.Web.Mvc.Controller.ExecuteCore()
 в System.Web.Mvc.ControllerBase.Выполнить(RequestContext Запрос context)
 в System.Web.Mvc.MvcHandler.c__DisplayClass6.c__DisplayClassb.b__5() 
 в System.Web.Mvc.Async.AsyncResultWrapper.c__DisplayClass1.b__0() 
 в System.Web.Mvc.MvcHandler.c__DisplayClasse.b__d() 
 в приложении System.Web.HttpApplication.Вызовите handlerexecutionstep.System.Web.HttpApplication.IExecutionStep.Выполнить()
 в приложении System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое значение и выполняется синхронно)

в global.asax.cs я регистрирую пользовательский атрибут:

 общедоступные статические пустые регистрационные глобальные фильтры (GlobalFilterCollection filters)
 {
 Фильтры.Добавить (новые контроллеры.ExtendendHandleErrorAttribute()); 
 }

определение выглядит следующим образом:

открытый класс ExtendendHandleErrorAttribute: HandleErrorAttribute
 {
 публичное переопределение аннулирует onException (ExceptionContext filterContext)
 { 
 Ошибки входа (filterContext);
 попробуйте
 { 
 база.Исключение onException (filterContext);

 var typedResult = filterContext.Result как результат просмотра;
 если (typedResult != null)
 {
 переменная tmpModel = typedResult.ViewData.Модель;
 typedResult.ViewData = filterContext.Controller.ViewData;
 typedResult.ViewData.Модель = CreateModel(filterContext);
 filterContext.Result = typedResu<
 }
 } 
 перехват (исключение ex) 
 {
 новый LogManager().Log("Ошибка ExtendendHandleErrorAttribute", например);
 }
 }

интересно здесь то, что я создаю ErrorCodeModel.

 private ErrorCodeModel CreateModel(ExceptionContext filterContext)
 {
 переменная модель = новый ErrorCodeModel(); 

 если (filterContext.HttpContext.Session != null)
 {
 var session = filterContext.HttpContext.Session;

 Модель.SessionID = сессия.Идентификатор сеанса;
 StateHandler stateHandler = новый StateHandler (сеанс);
 Модель.FapiErrorCode = stateHandler.Пользовательский код ошибки.toString(); 
попробуйте 
 { 
 Модель.GlobalData = новый GlobalDataBuilder (stateHandler).Build(); 
 модель.Сообщение об ошибке = модель.GlobalData.текст ошибки.Техническая ошибка;
 } 
 catch { }
 }

 возвращает модель; 
 }

мой Web.config

<Режим пользовательских ошибок= "Выкл." defaultRedirect="Ошибка">
 <код состояния ошибки="404" перенаправление="Ошибка / Файл не найден" />
 </customErrors>

Комментарии:

1. Можете ли вы вкратце объяснить свой сценарий, чего вы пытаетесь достичь, что вы сделали для его достижения, а что не сработало? Ну, в последней части вы уже показали сообщение об ошибке.

Ответ №1:

В ~/Views/Shared/Error.cshtml замените первую строку:

 @model System.Web.Mvc.HandleErrorInfo
  

с

 @model BusinessLogic.Models.ErrorCodeModel
  

Комментарии:

1. В моем Error.cshtml есть пользовательский @model, и я все еще получаю ошибку. Есть еще идеи?

Ответ №2:

При использовании [HandleError] атрибута в контроллере или действии любые возникающие исключения приведут к перенаправлению на пользовательские страницы ошибок, как описано в вашем web.config. По умолчанию ошибки относятся к ~ViewsSharedError.cshtml использованию HandleErrorInfo модели.

Раздел web.config может быть чем-то вроде:

 <system.web>
  <customErrors mode="On" defaultRedirect="Error.aspx">
     <error statusCode="403" redirect="NoAccess.htm"/>
     <error statusCode="404" redirect="FileNotFound.htm"/>
  </customErrors>
</system.web>
  

Ответ №3: