继续这个问题:
我有一个类似的要求,我的最终用户不希望在登陆的URL或应用程序的“主页”中看到控制器名称。
我有一个名为DeviceController
的控制器,我想成为“主页”控制器。这个控制器有很多动作,我想使用URL如下:
http://example.com -> calls Index() http://example.com/showdevice/1234 -> calls ShowDevice(int id) http://example.com/showhistory/1224 -> calls ShowHistory(int id)
我还需要为此控制器生成的链接省略网址的/device
部分。
我还有许多其他控制器,例如BuildController
:
http://example.com/build http://example.com/build/status/1234 http://example.com/build/restart/1234
等等。这些控制器的URL很好。
问题在于,即使在研究了上述问题的答案之后,我似乎也无法理解这个问题。
有人可以提供解释如何执行此操作的代码示例吗?
我正在使用ASP.NET MVC2。
答案 0 :(得分:6)
试试这个:
private void RegisterRoutes(RouteCollection routes) {
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("default", "{controller}/{action}/{id}",
new { action = "index", id = "" },
// Register below the name of all the other controllers
new { controller = @"^(account|support)$" });
routes.MapRoute("home", "{action}",
new { controller = "device", action = "index" });
}
e.g。 /富
如果foo
不是控制器,则将其视为device
控制器的操作。
答案 1 :(得分:0)
第1步: 创建路线约束。
public class RootRouteConstraint<T> : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower());
return rootMethodNames.Contains(values["action"].ToString().ToLower());
}
}
第2步:
在默认映射上方添加新路由映射,该映射使用我们刚创建的路由约束。泛型参数应该是您计划用作“根”控制器的控制器类。
routes.MapRoute(
"Root",
"{action}",
new {controller = "Home", action = "Index", id = UrlParameter.Optional},
new {isMethodInHomeController = new RootRouteConstraint<HomeController>()}
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new
{controller = "Home", action = "Index", id = UrlParameter.Optional}
);
现在您应该能够访问您的家庭控制器方法,如下所示: example.com/about, example.com/contact
这只会影响HomeController的url。 Alll其他控制器将具有默认路由功能。