#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>