我创建了正确的模型类型,并且不明白它的来源。任何想法?
System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Web.Mvc.HandleErrorInfo', but this dictionary requires a model item of type 'BusinessLogic.Models.ErrorCodeModel'. at System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value) at System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary) at System.Web.Mvc.WebViewPage`1.SetViewData(ViewDataDictionary viewData) at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) at System.Web.Mvc.Controller.ExecuteCore() at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) at System.Web.Mvc.MvcHandler.c__DisplayClass6.c__DisplayClassb.b__5() at System.Web.Mvc.Async.AsyncResultWrapper.c__DisplayClass1.b__0() at System.Web.Mvc.MvcHandler.c__DisplayClasse.b__d() at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)在global.asax.cs中的
我注册了一个自定义属性:
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new Controllers.ExtendendHandleErrorAttribute()); }
定义如下:
public class ExtendendHandleErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { LogErrors(filterContext); try { base.OnException(filterContext); var typedResult = filterContext.Result as ViewResult; if (typedResult != null) { var tmpModel = typedResult.ViewData.Model; typedResult.ViewData = filterContext.Controller.ViewData; typedResult.ViewData.Model = CreateModel(filterContext); filterContext.Result = typedResult; } } catch(Exception ex) { new LogManager().Log("ExtendendHandleErrorAttribute error", ex); } }
有趣的是我创建了ErrorCodeModel。
private ErrorCodeModel CreateModel(ExceptionContext filterContext) { var model = new ErrorCodeModel(); if (filterContext.HttpContext.Session != null) { var session = filterContext.HttpContext.Session; model.SessionId = session.SessionID; StateHandler stateHandler = new StateHandler(session); model.FapiErrorCode = stateHandler.CustomErrorCode.ToString(); try { model.GlobalData = new GlobalDataBuilder(stateHandler).Build(); model.ErrorMessage = model.GlobalData.ErrorText.TechnicalError; } catch { } } return model; }
我的Web.config
<customErrors mode="Off" defaultRedirect="Error"> <error statusCode="404" redirect="Error/FileNotFound" /> </customErrors>
答案 0 :(得分:3)
在控制器或操作上使用[HandleError]
属性时,抛出的任何异常都会导致重定向到web.config所描述的自定义错误页面。默认情况下,错误会使用~\Views\Shared\Error.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>
答案 1 :(得分:3)
在~/Views/Shared/Error.cshtml
替换第一行:
@model System.Web.Mvc.HandleErrorInfo
与
@model BusinessLogic.Models.ErrorCodeModel
答案 2 :(得分:2)