mvc中的自定义错误

时间:2015-03-05 06:53:01

标签: asp.net-mvc asp.net-mvc-4 model-view-controller custom-errors

我想在mvc中创建一个Cutsum错误。

我在web.config中添加了自定义错误

<customErrors mode="On" defaultRedirect="~/Error">
  <error redirect="~/Error/NotFound" statusCode="404" />
</customErrors>

在全球

 protected void Application_Error(object sender, EventArgs e)
    {
        Exception exception = Server.GetLastError();
        Server.ClearError();

        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("action", "Index");
        routeData.Values.Add("exception", exception);

        if (exception.GetType() == typeof(HttpException))
        {
            routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
        }
        else
        {
            routeData.Values.Add("statusCode", 500);
        }

        IController controller = new ErrorController();
        controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
        Response.End();
    }

并在控制器中

public class ErrorController : Controller
{
    //
    // GET: /Error/

    public ActionResult Index(int statusCode, Exception exception)
    {
        Response.StatusCode = statusCode;
        var model = new ErrorModel() {Exception = exception, HttpStatusCode = statusCode};
        return View(model);
    }

    public ActionResult NotFound()
    {
        Response.StatusCode = 404;  //you may want to set this to 200
        return View();
    }

}

并在视野中

@model Behkam.Models.ErrorModel
@if (Model != null && HttpContext.Current.IsDebuggingEnabled)
{
<i class="icon-404"></i>
<h1>@Model.HttpStatusCode</h1>
<h2>خطا در دریافت اطلاعات ! </h2>
<p class="page-404">@Model.Exception.Message .@Html.ActionLink("بازگشت  به کارتابل  ", "index", "Dashboard")</p>
 }

当我在页面中收到错误时,它会返回所有异常的错误:

  

传递到字典中的模型项的类型是&#39; System.Web.Mvc.HandleErrorInfo&#39;,但此字典需要类型为&#39; Behkam.Models.ErrorModel

的模型项

1 个答案:

答案 0 :(得分:0)

这是因为异常由代码中某处的[HandleError]属性处理(异常的堆栈跟踪或目标站点会告诉您在哪里。)

所以你想找到并删除那个属性。 [HandleError]创建'System.Web.Mvc.HandleErrorInfo'并将其传递到\Views\Shared\Error.cshtml作为模型,但当然您已将错误页面的模型更改为

@model Behkam.Models.ErrorModel

因此:

  

传递到字典中的模型项是类型的   'System.Web.Mvc.HandleErrorInfo',但这个字典需要一个模型   'Behkam.Models.ErrorModel

类型的项目

请注意,标准MVC应用程序模板执行以下操作以全局注册[HandleErrorAttribute]

public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
           filters.Add(new HandleErrorAttribute());       
        }
    }

所以这可能是罪魁祸首。