我正在使用RC2
使用URL路由:
routes.MapRoute(
"Error",
"{*url}",
new { controller = "Errors", action = "NotFound" } // 404s
);
Run Code Online (Sandbox Code Playgroud)
以上似乎照顾这样的请求(假设默认路由表由初始MVC项目设置):"/ blah/blah/blah/blah"
覆盖控制器本身中的HandleUnknownAction():
// 404s - handle here (bad action requested
protected override void HandleUnknownAction(string actionName) {
ViewData["actionName"] = actionName;
View("NotFound").ExecuteResult(this.ControllerContext);
}
Run Code Online (Sandbox Code Playgroud)
但是,之前的策略不处理对Bad/Unknown控制器的请求.例如,我没有"/ IDoNotExist",如果我请求这个,我从Web服务器获取通用404页面而不是我的404,如果我使用路由+覆盖.
最后,我的问题是: 有没有办法在MVC框架中使用路由或其他东西来捕获这种类型的请求?
或者我应该默认使用Web.Config customErrors作为我的404处理程序并忘记所有这些?我假设如果我使用customErrors,由于Web.Config对直接访问的限制,我必须在/ Views之外存储通用404页面.
可能重复:
如何在ASP.NET MVC中正确处理404?
我已经在Asp.Net MVC(RC 5)中的404 Http错误处理程序中进行了更改,我仍然得到标准的404错误页面.我需要在IIS中更改某些内容吗?
当有人键入不调用ASP.NET MVC中的有效操作或控制器的URL而不显示通用的"未找到资源"ASP.NET错误时,我试图创建自定义HTTP 404错误页面.
我不想使用web.config来处理这个问题.
是否有任何类型的路由魔法可以捕获任何无效的URL?
更新:我尝试了给出的答案,但我仍然得到丑陋的"资源未找到"消息.
另一个更新:好的,显然RC1中发生了一些变化.我甚至尝试过专门捕获404 HttpException,它仍然只是给了我"资源未找到"页面.
我甚至使用过MvcContrib的资源功能,没有 - 同样的问题.有任何想法吗?
asp.net asp.net-mvc custom-error-pages asp.net-mvc-routing http-status-code-404
我有一些基本代码来确定我的MVC应用程序中的错误.目前在我的项目,我有一个名为控制器Error与操作方法HTTPError404(),HTTPError500()和General().它们都接受一个字符串参数error.使用或修改下面的代码.将数据传递给Error控制器进行处理的最佳/正确方法是什么?我想尽可能提供强大的解决方案.
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
if (httpException != null)
{
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
switch (httpException.GetHttpCode())
{
case 404:
// page not found
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// server error
routeData.Values.Add("action", "HttpError500");
break;
default:
routeData.Values.Add("action", "General");
break;
}
routeData.Values.Add("error", exception);
// clear error on server
Server.ClearError();
// at this point how to …Run Code Online (Sandbox Code Playgroud) 我一直在寻找使用ELMaH与ASP.Net MVC的一些方法,以便我可以使用自定义错误页面来处理包括404s在内的所有异常.
有没有短缺的问题 ,询问如何获得/Shared/Error.aspx在ASP.Net MVC正常工作-不论有无ELMAH.我没有遇到过这个任务的问题,但我觉得我在ELMaH旁边使用自定义404页面的解决方案太简单了,我不能动摇它应该有更多的感觉.
在Web.Config中启用customErrors后,我在HomeController中创建了一个新的Action:
public ActionResult PageNotFound()
{
return null;
}
Run Code Online (Sandbox Code Playgroud)
从那里我在我的Global.asax文件中添加了一个新方法,以利用ELMaH的日志过滤功能,并在记录异常后,将响应重定向回上述PageNotFoundActionResult:
public void errorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
if (e.Exception.GetType().Equals(typeof(HttpException)))
{
HttpException ex = (HttpException)e.Exception;
if (ex.GetHttpCode() == 404)
Response.Redirect("/Home/PageNotFound");
}
}
Run Code Online (Sandbox Code Playgroud)
我是否忽略了默认情况下MVC附带的东西(因为我仍然找到了很多关于MVC的方法),或者过度思考存在更简单解决方案的问题?感谢任何输入.
我想在MVC中启用默认路由.
我希望每个404请求重定向到DefaultController DefaultRout()
我发现如何能够捕获所有路径以处理ASP.NET MVC的'404 page not found'查询?
但{*url}不能正常工作我得到404并且没有重定向到默认页面.
我的代码:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.IgnoreRoute("{resource}.ascx/{*pathInfo}");
routes.IgnoreRoute("{resource}.ashx/{*pathInfo}");
routes.IgnoreRoute("{resource}.gif/{*pathInfo}");
//http://localhost:4775/BW/A/Tasks
routes.MapRoute("Pages", "A/{controller}", new { controller = "Tasks", action = "InitPage" });
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "Default", action = "DefaultRout" }
);
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
谢谢
拉斐尔