我在Visual Web Developer 2010 Express中创建了一个新的ASP.NET MVC 3 Internet应用程序,我注意到使用此默认模板,路径localhost:port/Home
显示与localhost:port/
相同的内容
有没有办法删除/Home
?我只希望localhost:port/
成为目标网页。
答案 0 :(得分:3)
两个网址都有效,因为这是在Global.asax中定义默认路由的方式:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
这意味着/
,/Home
和/Home/Index
的所有内容都会落入HomeController/Index
行动。因此,事实上,当您请求/
时,执行的操作完全相同。
您可以像这样修改它:
routes.MapRoute(
"Default",
"{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
当然,通过这样做,您将能够在应用程序中运行的唯一控制器和操作将是HomeController和Index操作。由于您未在URL中提供任何指定它们的方法,因此无法访问任何其他操作或控制器。所以我会保留默认路由,因为它们允许处理99%的情况,除非你有一些特定的要求。
答案 1 :(得分:3)
其他人都是对的。然而,他们并没有真正告诉你一个方法。更好地控制路线的一种方法如下
在注册路线方法
中执行以下操作 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 });
}
然后使用route属性修饰控制器方法,该属性确切地定义了路由应该是什么。你必须自己创建route属性,它只是一个带有字符串参数的属性。通过这种方式,您可以将任何控制器方法设置为您喜欢的任何路径。