我一直在尝试为像 Facebook 这样的用户提供在 URL 中添加他们公司名称的选项:
http://localhost:50753/MyCompany/Login
我尝试了不同的 URL,但没有用。
routes.MapRoute(
name: "Default",
url: "{companyName}/{controller}/{action}",
defaults: new { controller = "Login", action = "Index"}
);
routes.MapRoute(
name: "Login",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
);
现在,当我添加此路由以使其工作时,我所有的 AJAX 请求都启动失败,成功的请求代表 HTML 而不是 JSON。我注意到的是,由于这条路线,我的页面再次重新加载。
谁能帮我弄清楚如何使用 MVC 路由来完成(如果可能,或者我的想法有误)?
最佳答案
您遇到的问题是因为这两个路由都匹配所有定义了 1、2 或 3 个段的 URL(因为 Controller 和操作具有默认值)。由于路由是按从顶部路由到底部路由的顺序执行的,因此您的顶部路由将始终匹配,而您的底部路由从不将匹配(主页除外)。
由于顶级路由始终匹配,假设第一段是 Controller 而第二段是操作的 URL 将失败,因为您将这些值放入 companyName
和 controller
路由键,分别。
要使其按您预期的那样工作,您需要创建一个知道所有公司名称的路由约束。
routes.MapRoute(
name: "Default",
url: "{companyName}/{controller}/{action}",
defaults: new { controller = "Login", action = "Index"},
constraints: new { companyName = "Company1|Comany2|Company3" }
);
请注意,您可以实现 IRouteConstraint
因此您可以从缓存的数据库模型中提取要匹配的值,而不是将它们硬编码到配置中。参见 this post了解如何创建自定义路由约束。
或者,如 Andy 所述,您可以通过明确指定 URL 的 1 个或多个片段来使匹配唯一。
url: "{companyName}/Login"
想法是必须有一些方法使您定义的第一条路线在某些情况下不匹配。
或者,您可以实现 RouteBase
,但只有当您需要比这个简单的场景更多地控制匹配过程时才需要这样做。
关于c# - 在 Routes mvc 4 中添加公司名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28812432/