我试图在ASP.NET MVC 4中实现一个通用的自定义错误页面,我基本上设置了一个错误布局,它定义了一个用于输出响应的http状态代码的部分。
我希望我的错误在继承这样的布局时结束,并简单地添加来自其模型的消息,该消息是在web.config中为处理自定义错误而设置的Controller (称为"Error")中的视图()调用中实例化和传递的。
<customErrors defaultRedirect="/Error" mode="On"> 
</customErrors>自定义错误控制器
public class ErrorController : Controller
{
    public ActionResult Index()
    {
        return View(new CustomErrorViewModel(Response.Status));
    }
}自定义错误视图
@{
    Layout = "~/Views/Shared/_CustomErrorLayout.cshtml";
}
@using System.Web.Configuration;
@using System.Configuration;
@using MVC_Tests.Models;
@model CustomErrorViewModel
@section HttpCode { @Response.StatusCode }
@Model.Status布局是:
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
    <link href="~/Content/CustomError.css" rel="stylesheet" />
</head>
<body>
    <div id="divError">
        <h1>
            <span>Error  </span>
            @RenderSection("HttpCode")
        </h1>
        <div id="divErrorMessage">
            <p>@RenderBody()</p>
        </div>
    </div>
</body>
</html>我试图处理的错误是一个简单的除法,我将其添加到主索引操作中。请注意,我需要一个单视图来处理不同的服务器http状态错误代码(500个系列)。我知道每个不同的http状态代码都有不同的视图,我只需要一个视图来处理多个代码。
自定义错误处理工作正常,我以所需的视图结束--但是--如上所述,我希望输出错误的http状态代码。相反,我总是显示200 (OK),根据我的理解和调试,这是因为:
1.首先,当被零的除法绊倒时,会引发异常。
2.现在发生了重定向,因为我的web.config指令以自定义的方式处理错误(因为web.config中没有指定特定的http状态代码,所以在同一个控制器/视图("/Error")中处理每个http状态错误代码)。这里关键的是重定向是一个新的请求。
3.从步骤2重定向将我发送到Error Controller,然后它将我发送到它的视图,该视图将被呈现。
4.在呈现视图时,将http状态代码插入到布局定义部分,添加了我的自定义消息,并且http状态代码部分的输出为: 200 (OK)。为什么,如果一个500服务器端错误被强制抛出?因为,如果我没有错,视图将在不同的请求管道、重定向管道中呈现,并且在重定向过程中--没有出现错误--而我最终得到了200 (OK)状态响应。
我浏览了迪诺·埃斯波西托( Dino Esposito )的这文章,其中提到了如何处理asp.net mvc中的错误,但我不想将过滤器(OnException和HandleError属性解决方案)添加到应用程序的控制器中(我可以创建一个新的带有这种过滤器的基本控制器,并让所有其他控制器继承它,但这也需要更改所有控制器类)。他提到的最后一种方法(处理global.asax的Application_Error事件)--我不确定--我必须在处理程序中发出一个重定向"Response.Redirect“语句,这比在web.config中设置自定义页面的灵活性要好(我仍然可以重定向到web.config中定义的路由,但我不知道对于看起来如此简单的事情来说,这是否太麻烦了)。
-
发布于 2015-03-11 16:05:10
如果使用IIS7+,我会禁用“定制错误”,如下所示:
 <customErrors mode="Off" />然后像这样使用httpErrors:
<system.webServer>
 <httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace" defaultPath="/error">
     <remove statusCode="404" />
     <error statusCode="404" path="/error/notfound" responseMode="ExecuteURL" />
 </httpErrors>
....这使您可以使用控制器中的以下内容获得一个非url更改错误页,并显示404状态代码:
public class ErrorController : Controller
{
public ActionResult notfound()
    {
        Response.TrySkipIisCustomErrors = true;
        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View("OneErrorViewToRuleThemAll");
    }
}ps。"errorMode“需要更改为”自定义“,以便在本地设置(即,如果使用IISExpress)上看到它,在上传到活动服务器之前,您可能不会看到正确的错误。
pps。您可以使用单一视图"OneErrorViewToRuleThemAll“来处理您决定以这种方式处理的任何状态代码的屏幕上输出。每个ErrorController操作都将在此视图上结束。
发布于 2015-03-29 09:15:20
我正在寻找的解决方案(在濒临放弃之后)被描述为这里。
总结这些步骤:
filters.Add(new HandleErrorAttribute());文件中删除一行.使用这种方法,我终于成功地将错误500重定向到自定义页面。500似乎存在某种默认的跳过,因为为错误404设置自定义页不需要步骤2或步骤3。
因此,最后,对于我希望呈现自定义页面的每个http状态代码,我创建一个控制器操作,相应地设置所描述的属性,然后对所有操作重定向到相同的视图--在其中显示@Response.Status,使其足够成为我的通用解决方案。
https://stackoverflow.com/questions/28989026
复制相似问题