none
设置 mvc4 的路由时遇到的问题 RRS feed

  • 问题

  • 在 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;否则照常处理。

    2012年10月23日 18:58

全部回复

  • 为了在 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();
            }
        }
    }
    
    2012年10月23日 22:05
  • 哈哈,在两句 routes.MapRoute() 前面加上

    routes.IgnoreRoute("Home/Index/{*pathInfo}");
    

    就行了

    2012年10月24日 12:35
  • 楼上的方法可以,另外可以直接将这个/Home/Index/指到你的404页面去
    2012年10月25日 4:17
    版主
  • 楼上的方法可以,另外可以直接将这个/Home/Index/指到你的404页面去

    我最想让 /Home/Index/ 转到默认的 404,这样就少写点代码。如果要转,是通过 IIS 去设置,还是通过 web.config 或者其它?怎么做呢?
    2012年10月25日 17:12