我正在尝试配置ASP.NET MVC自定义错误页面。
我添加了一个Error
控制器,其中包含Index
和PageNotFound
个动作。我还将以下内容添加到 web.config 文件的<system.web>
部分。
<customErrors mode="On" defaultRedirect="~/Error">
<error statusCode="404" redirect="~/Error/PageNotFound"/>
<error statusCode="500" redirect="~/Error" />
</customErrors>
如果我输入的网址如 http://www.example.com/Home/BadPage ,我确实会看到我的错误处理程序。
但是,任何人都可以帮助我理解以下问题以及如何解决这些问题吗?
HttpNotFound()
作为结果。但是当发生这种情况时,我的自定义错误处理程序页面不显示。相反,它显示了一个似乎来自IIS的通用404页面。我正在使用当前版本的Visual Studio和MVC。
答案 0 :(得分:2)
除了在 web.config 中进行设置外,您还需要检查 Application_Error 中的Exception是否为 HttpException 404 。
<customErrors defaultRedirect="~/Common/Error" mode="On">
<error statusCode="404" redirect="~/Common/PageNotFound"/>
</customErrors>
protected void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
// Process 404 HTTP errors
var httpException = exception as HttpException;
if (httpException != null && httpException.GetHttpCode() == 404)
{
Response.Clear();
Server.ClearError();
Response.TrySkipIisCustomErrors = true;
IController controller = new CommonController();
var routeData = new RouteData();
routeData.Values.Add("controller", "Common");
routeData.Values.Add("action", "PageNotFound");
var requestContext = new RequestContext(
new HttpContextWrapper(Context), routeData);
controller.Execute(requestContext);
}
}
您还希望在 PageNotFound 操作方法中返回Response.StatusCode = 404;
。
public class CommonController : Controller
{
[AllowAnonymous]
public ActionResult PageNotFound()
{
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
return View();
}
[AllowAnonymous]
public ActionResult Error()
{
Response.StatusCode = 503;
Response.TrySkipIisCustomErrors = true;
return View();
}
}