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.
精彩评论