我的目标是从该控制器中的任何操作中删除“home”(参见粗体)。
site.com/home/about
的 site.com/about
site.com/home/contact
的 site.com/contact
我创建了以下自定义路由,它位于通用基本路由之上:
// Used to hide 'home' in the url
routes.MapRoute(
"Home", // Route name
"{action}", // URL with parameters
new { controller = "home", action= "index"} // Parameter defaults
);
这个几乎做我想要的。我现在得到site.com/about,site.com/contact等。但是,我不能将索引用于其他控制器。
site.com/person/create - >就像一个魅力 site.com/person/ - >不好。
我该如何解决这个问题?感谢。
答案 0 :(得分:1)
这两条路线应按预期工作:
routes.MapRoute(
"NoHomeRoute", // Route name
"{controller}/{action}", // URL with parameters
new { controller = "Person", action= "Index"}, // Parameter defaults
new { controller = @"person|admin|..." } // Parameter constraints
);
routes.MapRoute(
"HomeRoute", // Route name
"{action}", // URL with parameters
new { controller = "home", action= "index"} // Parameter defaults
);
由于每个应用程序都有一组预定义的控制器,您可以将除 home 之外的所有控制器放在上限制中,它将起作用。但是如果你创建一个新的控制器,记得也把它放进去。我为你明显拥有的PersonController
添加了 person ,并为你可能没有的AdminController
添加了 admin ,但我需要提供一些东西来向您展示添加控制器的模式。
如果您愿意使用正则表达式,那么您可能会想出一个排除 home 的解决方案,而不是包含除 home 以外的所有 home 的方式上部路线定义表明。
我检查了MVC代码,实际上你可以用这种方式定义第一个路径定义的未来证明约束:
routes.MapRoute(
"NoHomeRoute", // Route name
"{controller}/{action}", // URL with parameters
new { controller = "Person", action= "Index"}, // Parameter defaults
new { controller = @"(?!home).*" } // Parameter constraints
);
为什么要这样做?因为ProcessConstraint
方法上的行最后有这两行:
string pattern = "^(" + str + ")$";
return Regex.IsMatch(input, pattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
答案 1 :(得分:0)
// Used to hide 'home' in the url
routes.MapRoute(
"Home", // Route name
"{action}", // URL with parameters
new { controller = "home", action= "index"} // Parameter defaults);
应该是您注册的最后一条路线,否则site.com/person会被解释为一个动作,因为它将首先匹配该路线。