开发者

ASP.NET MVC 3 remove /Home

开发者 https://www.devze.com 2023-04-02 07:51 出处:网络
I\'ve created a new ASP.开发者_如何学CNET MVC 3 internet application in Visual Web Developer 2010 Express, and I have noticed that with this default template, the path localhost:port/Home shows the sa

I've created a new ASP.开发者_如何学CNET MVC 3 internet application in Visual Web Developer 2010 Express, and I have noticed that with this default template, the path localhost:port/Home shows the same content as localhost:port/

Is there a way to remove the /Home? I would only like localhost:port/ to be the landing page.


Both urls work because that's how the default route has been defined in Global.asax:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

This means that all of /, /Home and /Home/Index will land to the HomeController/Index action. So in fact when you are request / it is the exact same action being executed.

You can modify it like so:

routes.MapRoute(
    "Default",
    "{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Of course by doing this the only controller and action you will ever be able to run in your application will be the HomeController and Index action. No other action or controller will be ever accessible as you don't provide any means in the url to specify them. So I would leave the default routes as is because they allow to handle 99% of the cases unless you have some specific requirements.


The other guys are correct. However they dont really tell you a way around it. One way to get better control of the routes is as follows

Do something like below in the Register routes method

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        var controllers = typeof(MvcApplication).Assembly.GetTypes().Where(t => !t.IsAbstract && t.Navigate(_ => _.BaseType).Any(_ => _ == typeof(Controller)));
        foreach (var controller in controllers)
        {
            var actions = controller.GetMethods().Where(m => m.HasAttribute<RouteAttribute>()).Select(m => new { Method = m, Attribute = m.GetAttribute<RouteAttribute>() }).ToArray();
            foreach (var action in actions.OrderBy(m => m.Attribute.Path.Count(c => c == '{')))
                routes.MapRoute(string.Format("{0}.{1}", controller.Name, action.Method.Name), action.Attribute.Path.TrimStart('/'), new { controller = controller.Name.Replace("Controller", ""), action = action.Method.Name });
        }

and then decorate your controller methods with a route attribute that defines exactly what the route should be. You have to make the route attribute yourself, it cna be pretty simple just an attribute with a string parameter . In this fashion you can set any controller method to have any route you like.

0

精彩评论

暂无评论...
验证码 换一张
取 消