询问者
设置 mvc4 的路由时遇到的问题

问题
-
在 mvc4 中,我想让 www.site.com 唯一对应 HomeController.Index(),该怎么做?
如果我在 RouteConfig.cs 中这样实现 RouteConfig.RegisterRoutes,public static void RegisterRoutes(RouteCollection routes) { routes.MapRoute( name: "Empty", url: "", defaults: new { controller = "Home", action = "Index" }); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { id = UrlParameter.Optional }); }
则浏览 www.site.com 和 www.site.com/Home/Index/ 都会调用到 HomeController.Index()。而我只想让前者调用这个方法,后者返回 404。换句话说,对于 {controller}/{action}/ 这样的 url,如果 controller=Home 并且 action=Index,返回 404;否则照常处理。
全部回复
-
为了在 controller=Home 并且 action=Index 时返回 404,我给 {controller}/{action}/{id} 添加了自己的路由处理程序。这是不是最简单的做法?存不存在什么问题?
using System.Web.Mvc; public class RouteConfig { public static void RegisterRoutes(System.Web.Routing.RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Empty", url: "", defaults: new { controller = "Home", action = "Index" }); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { id = System.Web.Mvc.UrlParameter.Optional } ).RouteHandler = new DefaultRouteHandler(); } } public class DefaultRouteHandler : System.Web.Routing.IRouteHandler { public System.Web.IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext) { return new DefaultHttpHandler(requestContext); } } public class DefaultHttpHandler : System.Web.UI.Page { System.Web.Routing.RequestContext RequestContext { get; set; } public DefaultHttpHandler(System.Web.Routing.RequestContext requestContext) { this.RequestContext = requestContext; } protected override void OnInit(System.EventArgs e) { var controllerString = this.RequestContext.RouteData.GetRequiredString("controller"); var actionString = this.RequestContext.RouteData.GetRequiredString("action"); var controllerFactory = ControllerBuilder.Current.GetControllerFactory(); var controller = controllerFactory.CreateController(this.RequestContext, controllerString); if (controllerString.ToLower() == "home" && actionString.ToLower() == "index") this.Context.ApplicationInstance.Response.Status = "404 Not Found"; else { try { controller.Execute(this.RequestContext); } finally { controllerFactory.ReleaseController(controller); } this.Context.ApplicationInstance.CompleteRequest(); } } }