是否有可能创建一个捕获所有的最终路由...并将用户弹回到ASP.NET MVC中的404视图?
注意:我不想在我的IIS设置中设置它。
答案 0 :(得分:72)
自己找到答案。
Richard Dingwall有一个很好的帖子,通过各种策略。我特别喜欢FilterAttribute解决方案。我不喜欢在willy nilly周围抛出异常,所以我会看看我是否可以改进:)
对于global.asax,只需添加此代码作为注册的最后一条路径:
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "StaticContent", action = "PageNotFound" }
);
答案 1 :(得分:19)
这个问题首先出现了,但后来的问题更容易得到答案:
Routing for custom ASP.NET MVC 404 Error page
我通过创建一个ErrorController让我的错误处理工作 返回本文中的视图。我还要添加“Catch All” 到global.asax中的路由。
如果没有,我看不出它会如何到达这些错误页面 在Web.config ..?我的Web.config必须指定:
customErrors mode="On" defaultRedirect="~/Error/Unknown"
然后我还补充道:
error statusCode="404" redirect="~/Error/NotFound"
希望这有帮助。
我现在喜欢这种方式,因为它很简单:
<customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="~/Error/PageNotFound/" />
</customErrors>
答案 2 :(得分:4)
在项目根目录web.config文件下添加此行。
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
<remove statusCode="500" />
<error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
<remove name="FormsAuthentication" />
</modules>
答案 3 :(得分:4)
你也可以在Global.asax.cs中处理NOT FOUND错误,如下所示
protected void Application_Error(object sender, EventArgs e)
{
Exception lastErrorInfo = Server.GetLastError();
Exception errorInfo = null;
bool isNotFound = false;
if (lastErrorInfo != null)
{
errorInfo = lastErrorInfo.GetBaseException();
var error = errorInfo as HttpException;
if (error != null)
isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
}
if (isNotFound)
{
Server.ClearError();
Response.Redirect("~/Error/NotFound");// Do what you need to render in view
}
}
答案 4 :(得分:3)
使用
时可能会出现问题throw new HttpException(404);
当你想要捕获它时,我不知道编辑你的web配置的任何其他方式。
答案 5 :(得分:1)
创建全能路线的另一种方法是在每Marco's Better-Than-Unicorns MVC 404 Answer Application_EndRequest
MvcApplication
的基础上添加{{1}}方法。
答案 6 :(得分:1)
在RouterConfig.cs
内添加以下代码:
routes.MapRoute(
name: "Error",
url: "{id}",
defaults: new
{
controller = "Error",
action = "PageNotFound"
});
答案 7 :(得分:0)
如果路由无法解析,那么MVC框架将通过404错误.. 最好的方法是使用异常过滤器...创建一个自定义的异常过滤器并制作如下..
public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
public void OnException(ExceptionContext filterContext) {
filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html");
}
}