我正在创建一个多租户asp.net应用程序。我希望我的网址关注
**http://www.example.com/test1/test2/**{tenantName}/{controller}/{action}
**http://www.example.com/test1/**{tenantName}/{controller}/{action}
**http://www.example.com/**{tenantName}/{controller}/{action}
此处以粗体显示的网址部分是固定的(不会更改) {tenantName} =将是逻辑租户实例。
我已关注this链接 处理此问题的路由是什么?
答案 0 :(得分:3)
这很简单:
routes.MapRoute(
"MultiTenantRoute", // Route name
"test1/test2/{tenantName}/{controller}/{action}/{id}", // URL with parameters
new { id = UrlParameter.Optional } // Parameter defaults, if needed
);
没有大括号的部分必须匹配。大括号内的部件将转换为路径数据参数。我已经添加了一个可选参数id
,您可以在控制器中找到它,但您可以自定义它。您也可以像往常一样为tenantName,controller或action提供默认值。
请记住,路线按照他们注册的顺序进行评估,因此您应该在任何其他路线之前注册此路线。
问题更新后编辑
您无法在路径开头指定catch all all参数:{*segment}
。这是不可能的。 ASP.NET MVC不知道要包含在这部分中的段数,以及路由中其余参数剩余的段数。
因此,您需要为每种可能的情况添加路线,同时考虑将使用匹配的第一条路线。所以你需要以这样的额外参数开头的路线:
{tenanName}...
{segment1}{tenanName}...
{segment1}/{segment2}/{tenanName}...
根据预期网址的结构,您可能需要添加约束以确保路由正确匹配。这可以通过将第四个参数传递给thw MapRoute
方法来完成。这是一个匿名类,如deafults参数,但每个参数的指定值是一个约束。这些约束,就其最简单的形式而言,只是字符串,将用作正则表达式(正则表达式)。
如果预期的网址变化极大,then implement yout own routing class。
答案 1 :(得分:2)
您可以将路线定义为
routes.MapRoute(
name: "TennantRoute",
url: "test1/test2/{tenantName}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index"}
);
并且您的操作必须使用名称为tenantName
的参数,因为您可能希望根据该决定做出决定...例如
public ActionResult Index(string tenantName)
{
return View();
}
示例:http://localhost:19802/test1/test2/PrerakT/Home/Index
请确保在默认路线上方定义此路径,以便跟踪网址
http://localhost:19802/test1/test2/PrerakT/
http://localhost:19802/test1/test2/PrerakT/Home/
http://localhost:19802/test1/test2/PrerakT/Home/index
如果我希望test1和test2可以更改怎么办......
routes.MapRoute(
name: "TennantRoute",
url: "{test1}/{test2}/{tenantName}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
和
public ActionResult Index(string tenantName, string test1, string test2)
{
return View();
}
根据您对问题的更新
routes.MapRoute(
name: "TennantRoute1",
url: "test1/test2/{tenantName}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
routes.MapRoute(
name: "TennantRoute2",
url: "test1/{tenantName}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
routes.MapRoute(
name: "TennantRoute3",
url: "{tenantName}/{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);