asp.net-mvc – 为缺少的ASP.Net MVC控制器更正404消息
我有一个MVC 2应用程序,应该总是给出一个“漂亮的”404页面.
但是目前我得到了一个低级别.Net:“’/ sitename’应用程序中的服务器错误…” 我有一个基本控制器,它有一个NotFound动作,将呈现漂亮的404页面. 处理缺失的操作: protected override void HandleUnknownAction(string actionName) { this.NotFound(actionName).ExecuteResult(this.ControllerContext); } 因此,访问{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" }); catch全部正确捕获不匹配的路由. 所以{site} / Invalid / Action / id / extra通过catch all正确路由. 但是{site} / Invalid通过“MVC路由”路由获取并且ASP.Net寻找InvalidController,并在找不到它时抛出一个哑异常. 我知道我可以在web.config级别覆盖它,但这只是重定向到页面.我想知道路由模式何时匹配但控制器不是有效的控制器名称. 我在哪里可以捕捉并改变这种行为? 解决方法
我终于找到了答案,虽然它仍然不理想.
您可以使用正则表达式限制允许匹配路由的控制器名称,因此如果我们假设控制器工厂的默认实现,我们可以找出所支持的所有可能的类名: // build up a list of known controllers,so that we don't let users hit ones that don't exist var allMvcControllers = from t in typeof(Global).Assembly.GetTypes() where t != null && t.IsPublic && !t.IsAbstract && t.Name.EndsWith("Controller",StringComparison.OrdinalIgnoreCase) && typeof(IController).IsAssignableFrom(t) select t.Name.Substring(0,t.Name.Length - 10); // create a route constraint that requires the controller to be one of the reflected class names var controllerConstraint = new { controller = "(" + string.Join("|",allMvcControllers.ToArray()) + ")" }; // default MVC route routes.MapRoute( "MVC",id = UrlParameter.Optional },controllerConstraint); // fall back route for unmatched patterns or invalid controller names routes.MapRoute( "Catch All",action = "NotFound" }); 这不是理想的,它增加了应用程序启动的命中,但仍然感觉太复杂,但它确实具有所需的效果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 可以手动将OData参数应用于`.AsQueryable()`的结
- asp.net – 如何从ajax调用web api Controller
- asp.net-mvc – Action方法中的routeValues不接受ExpandoOb
- asp.net – 按IN子句排序SQL Server结果
- asp.net-mvc-routing – @ Url.Action获取?附加长度= 2
- ASP.NET MVC – 如何处理发送电子邮件?
- asp.net-mvc – 如何使用selenium进行ASP.NET MVC集成测试
- asp.net-mvc – 如何从视图中检索传递给我的自定义EditorFo
- asp.net – 通过反射获取其getter具有可选值的属性的值
- asp.net – 您在哪里存储数据库连接字符串?