我在这里发现了另一个问题,它提供了我的问题的第一部分的解决方案,即如何在ASP.NET MVC中生成404页面而不重定向到另一个页面(因此最初请求的URL保留在地址栏中).
ASP.NET MVC - 如何抛出类似于StackOverflow上的404页面
protected void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
Response.Clear();
var httpException = exception as HttpException;
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException != null)
{
routeData.Values.Add("action", httpException.GetHttpCode() == 404 ? "NotFound" : "Unknown");
// clear the error, otherwise, we will always get the default error page.
Server.ClearError();
// call the controller with the route
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
}
Run Code Online (Sandbox Code Playgroud)
如果我不使用IOCControllerFactory,404方面的工作对我来说很好,但是一旦我使用工厂,不 …
我有一点时间搞清楚如何正确实现我的404重定向.
如果我使用以下内容
<HandleError()> _
Public Class BaseController : Inherits System.Web.Mvc.Controller
''# do stuff
End Class
Run Code Online (Sandbox Code Playgroud)
然后页面上任何未处理的错误将加载"错误"视图,该视图效果很好. http://example.com/user/999(其中999是无效的用户ID)会在保留原始URL时抛出错误(这就是我想要的)
然而.如果有人将http://example.com/asdfjkl输入到url(其中asdfjkl是无效的控制器),则IIS将抛出通用404页面.(这不是我想要的).我需要的是上面要应用的相同内容.原始URL保留,并加载"NotFound"控制器.
我正在注册这样的路线
Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.RouteExistingFiles = False
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
routes.IgnoreRoute("Assets/{*pathInfo}")
routes.IgnoreRoute("{*robotstxt}", New With {.robotstxt = "(.*/)?robots.txt(/.*)?"})
routes.AddCombresRoute("Combres")
routes.MapRoute("Start", "", New With {.controller = "Events", .action = "Index"})
''# MapRoute allows for a dynamic UserDetails ID
routes.MapRouteLowercase("UserProfile", "Users/{id}/{slug}", _
New With {.controller = "Users", .action = "Details", .slug = UrlParameter.Optional}, _
New With {.id = "\d+"} …Run Code Online (Sandbox Code Playgroud) 我有一个MVC 2应用程序,应该总是提供一个"漂亮的"404页面.
但是目前我得到了一个低级别的.Net:"'/ sitename'应用程序中的服务器错误..."
我有一个基本控制器,它有一个NotFound动作,将呈现漂亮的404页面.
处理缺失的操作:
protected override void HandleUnknownAction(string actionName)
{
this.NotFound(actionName).ExecuteResult(this.ControllerContext);
}
Run Code Online (Sandbox Code Playgroud)
所以访问{site}/ValidController/NotAnAction正确地路由.
但是访问{site}/NotAController没有.
我设置的路线全部为:
routes.MapRoute(
"MVC routes",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional });
routes.MapRoute(
"Catch All",
"{*url}",
new { controller = "System", action = "NotFound" });
Run Code Online (Sandbox Code Playgroud)
catch全部正确捕获不匹配的路由.
所以{site}/Invalid/Action/id/extra通过catch all正确路由.
然而{site}/Invalid,通过"MVC路由"路由获取并且ASP.Net寻找InvalidController,并且当它找不到时抛出一个愚蠢的异常.
我知道我可以在web.config关卡中覆盖它,但这只是重定向到页面.我想知道路由模式何时匹配但控制器不是有效的控制器名称.
我在哪里可以捕捉并改变这种行为?