我使用VS 2013的标准MVC模板。
使用默认设置, HTTP://网站/将被路由到网站/首页/索引。
如何将所有的“行动”的直属网站根URL,例如HTTP://网站/ XXX ,表现出同样的内容的http://网站/主页/ XXX ? 比如,如何让我的http://网站/关于执行的Home控制器的关于行动? 如果可能的话,解决方案不应该是一个HTTP重定向到HTTP://网站/首页/因为我不想表现出“丑”首页/ url中。
我使用VS 2013的标准MVC模板。
使用默认设置, HTTP://网站/将被路由到网站/首页/索引。
如何将所有的“行动”的直属网站根URL,例如HTTP://网站/ XXX ,表现出同样的内容的http://网站/主页/ XXX ? 比如,如何让我的http://网站/关于执行的Home控制器的关于行动? 如果可能的话,解决方案不应该是一个HTTP重定向到HTTP://网站/首页/因为我不想表现出“丑”首页/ url中。
你可以尝试类似以下
routes.MapRoute(
name: "MyAppHome",
url: "{action}/{wa}",
defaults: new { controller = "Home", action = "Index", wa = UrlParameter.Optional, area = "Admin" },
namespaces: new string[] { "MyApp.Controllers" }
).DataTokens = new RouteValueDictionary(new { area = "Admin" });
在这里,你可能会注意到家庭控制器是硬编码,并且不再在要求提供。 你也可以利用的RouteDebugger
与路线玩。
HTH
我无法找到一个答案,这是一个覆盖面会与面向公众的网站的所有问题,而作为一个痛苦的维护,同时仍然保持灵活性。
最后我想出以下。 它允许使用多个控制器,不需要任何保养,并且使所有的网址小写。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
//set up constraints automatically using reflection - shouldn't be an issue as it only runs on appstart
var homeConstraints = @"^(?:" + string.Join("|", (typeof(Controllers.HomeController)).GetMethods(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.DeclaredOnly).Select(x => (x.Name == "Index" ? "" : x.Name))) + @")$";
//makes all urls lowercase, which is preferable for a public facing website
routes.LowercaseUrls = true;
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//maps routes with a single action to only those methods specified within the home controller thanks to contraints
routes.MapRoute(
"HomeController",
"{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { action = homeConstraints }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}