asp.net-mvc – 如何将服务器错误的http状态代码捕获到ASP.NET MVC中的通用自定义错误视图中
|
我试图在ASP.NET MVC 4中实现一般自定义错误页面.
我希望我的错误最终继承这样的布局的视图,并简单地添加一个来自其模型的消息,该消息被实例化并传递给Controller中的View()调用(名为“Error”)我设置在web.config中处理自定义错误. <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>
我试图处理的错误是一个简单的除零,我添加到Home Index操作.请注意,我想要一个视图来处理不同的服务器http状态错误代码(500系列).我知道每个不同的http状态代码都有不同的视图,我在一个视图之后处理多个代码. 自定义错误处理正在运行,我在所需的视图中结束 – 但是 – 如上所述,我希望输出错误的http状态代码. 1.首先,在将除法绊倒时,会产生异常. 2.现在进行重定向,由于我的web.config指令以自定义方式处理错误(因为在web.config中没有指定特定的http状态代码,我在同一控制器/视图中处理每个http状态错误代码( “/错误”).这里至关重要的是重定向是一个新请求. 3.来自步骤2的重定向将我发送到错误控制器,然后它将我发送到其视图,该视图将被渲染. 4.在渲染视图时,http状态代码插入布局定义部分,我的自定义消息被添加,http状态代码部分的输出如我所说:200(OK).为什么,如果强行抛出500服务器端错误?因为,如果我没有错,视图将在不同的请求管道中呈现,重定向,并且在重定向时 – 不会发生错误 – 我最终得到200(OK)状态响应. 我在Dino Esposito上发表了关于在asp.net mvc中处理错误的this帖子,但是我不想在所有应用程序的控制器中添加过滤器(OnException和HandleError属性解决方案)(我可以创建一个具有这种过滤器的新基本控制器,并使所有其他人继承它,但这也需要更改所有控制器类).他提到的最后一种方法(处理global.asax的Application_Error事件)我不确定是否可以实现此目的 – 我必须在处理程序中发出重定向“Response.Redirect”语句,这超出了能够设置自定义页面的灵活性在web.config中(我仍然可以重定向到web.config中定义的路由,但我想知道这对于看起来如此简单的事情来说是不是太麻烦了). 将响应的任何服务器错误的http状态代码捕获到我的自定义错误视图中的最佳方法是什么? 解决方法如果您正在使用IIS7,我会禁用“customerrors”,如下所示:<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>
....
这允许您使用控制器中的以下内容获取显示404状态代码的非URL更改错误页面: public class ErrorController : Controller
{
public ActionResult notfound()
{
Response.TrySkipIisCustomErrors = true;
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View("OneErrorViewToRuleThemAll");
}
}
PS. “errorMode”需要更改为“Custom”才能在本地查看….根据您的本地设置(即如果您使用的是IISExpress),在上传到实时服务器之前,您可能看不到正确的错误. PPS.您可以使用单个视图“OneErrorViewToRuleThemAll”来处理您决定以这种方式处理的任何状态代码的屏幕输出.每个ErrorController Action都会以此视图结束. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 为什么我需要PUT或DELETE Http Verbs?
- ASP.NET UserControl不初始化子控件
- asp.net – 替换过时的System.Xml.XmlDataDocument?
- Asp.net mvc dataannotation MaxLength验证不起作用
- 如何在Asp.Net identity 2中手动检查密码?
- asp-classic – 如何检查VBScript中是否存在POST提交字段?
- asp.net-mvc – 如何在ASP.NET MVC视图中访问路由参数?
- 什么可能导致“客户端断开连接”的ASP.NET异常?
- entity-framework-4 – 在我的自定义MembershipProvider中使
- asp.net-mvc – ASP.NET MVC中的小写URL
- asp.net – 从aspx页面中的Static方法访问ViewSt
- asp.net – 考虑Scalablity和友好URL的GUID替代方
- asp.net web大文件上传带进度条实例代码
- asp.net – SmtpClient.SendAsync调用自动取消
- asp.net核心 – aspnetcidev和aspnetvnext之间的
- 如何配置asp.net进程在域帐户下运行?
- 在使用ASP.NET会话时是否可以强制请求并发?
- asp.net – 在双列表框中移动项目
- asp.net-mvc – ASP.NET MVC中的Authorize属性是
- ASP.NET vNext Core CLR缺少type.IsPrimitive
