C# 在Routes mvc 4中添加公司名称
我一直在尝试为Facebook等用户提供在URL中添加公司名称的选项:C# 在Routes mvc 4中添加公司名称,c#,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc Routing,我一直在尝试为Facebook等用户提供在URL中添加公司名称的选项: http://localhost:50753/MyCompany/Login 我尝试了不同的URL,但没有成功 routes.MapRoute( name: "Default", url: "{companyName}/{controller}/{action}", defaults: new { controller = "L
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路由(如果可能的话,或者如果我的想法不正确的话)来完成吗 问题是无法区分您的两条路线。例如/a/b/c可以是company=a、controller=b、action=c的默认路由,也可以是controller=a、action=b、id=c的登录路由 要解决这个问题,您需要设计路由,包括用于AJAX的路由,这样两个路由就不可能有相同的URL。在您的示例中,您可以从登录路径中删除/{id},因为它不是必需的。还要更具体地指定URL,并将其置于默认URL之前。这会给你一些
routes.MapRoute(
name: "Login",
url: "{companyName}/Login",
defaults: new { controller = "Login", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{companyName}/{controller}/{action}",
defaults: new { controller = "Login", action = "Index"}
);
在这种情况下,/MyCompany/Login和/MyCompany/Login/Index都会进入登录页面。然而,MyCompany/Home/Index将转到controller=Home,action=Index
就我个人而言,我倾向于完全删除默认路由,这样我就可以指定我想要的URL,而不是将它们全部作为/controller/action。这给了您更多的控制权,但确实意味着单独指定每个路由。您遇到的问题是,这两个路由都将匹配定义了1、2或3个段的所有URL(因为控制器和操作具有默认值)。由于路由是按从顶部路由到底部路由的顺序执行的,因此顶部路由将始终匹配,而底部路由将永远不匹配(主页除外) 由于顶部路由始终匹配,因此假定第一段是控制器,第二段是操作的URL将失败,因为您分别将这些值放入
companyName
和controller
路由键中
要使其按预期工作,您需要创建一个知道所有公司名称的路由约束
routes.MapRoute(
name: "Default",
url: "{companyName}/{controller}/{action}",
defaults: new { controller = "Login", action = "Index"},
constraints: new { companyName = "Company1|Comany2|Company3" }
);
请注意,您可以实现,以便可以从缓存的数据库模型中提取要匹配的值,而不是将它们硬编码到配置中。请参见以了解如何创建自定义管线约束
或者,正如Andy提到的,您可以通过显式指定URL的一个或多个段来使匹配唯一
url: "{companyName}/Login"
我们的想法是,必须有某种方法使您定义的第一条路线在某些情况下不匹配
或者,您也可以实施,但只有在您需要比此简单场景更多地控制匹配过程时,才需要实施。Ty帮助我:)