MikeSW 对路线很接近,但听起来您不希望特许经营商页面与公司页面共享任何控制器。我还有一些其他的想法:
routes.MapRoute(null, // do not name your routes, they are "magic strings"
"{tenant}/{controller}/{action}",
new
{
// strongly type controller, action, and area names using T4MVC
controller = MVC.Home.Name,
action = MVC.Home.ActionNames.Index,
// it sounds here like you want this controller for franchisees only,
// so corporate pages will use other controllers. if this is the case,
// tenant="default" // require the parameter by not supplying a default
});
不命名路由的原因是因为不命名它们会迫使您在某些 html 帮助器和控制器方法中使用某些重载。方法中有很多重载,例如RedirectToRoute
,@Html.RouteLink
和@Url.RouteUrl
将路由名称作为第一个参数。通过从路由中省略名称,这迫使我们使用仅依赖于路由参数和 HTTP 方法的重载来解析控制器和操作。(T4MVC在这里也很有帮助,因为它允许我们为这些方法的参数强输入区域、控制器和动作名称。)
MVC 将在为其呈现视图的 URL 中自动使用“环境”路由参数。因此,如果您在 URL 上domain.com/atl
并想要链接到domain.com/atl/stuff
,则可以输出如下超链接:
@Html.RouteLink("Stuff", new
{
// this will render a link with the URL domain.com/atl/stuff
controller = MVC.Stuff.Name,
action = MVC.Stuff.ActionNames.Index,
// you do not need to include franchisee
})
(如果您只想呈现普通 HTML<a>
标记的 href 参数的 URL,请@Url.RouteUrl
改用。)
另一方面,如果您想从一个加盟商网站链接到另一个,则必须指定加盟商参数:
@Html.RouteLink("Another franchisee in this state", new
{
// this will render a link with the URL domain.com/macon
controller = MVC.Home.Name,
action = MVC.Home.ActionNames.Index,
franchisee = "macon"
})