2015-03-02 77 views
3

我一直在试图给选项,用户如Facebook在URL中添加他们的公司名称:添加公司名称MVC 4

http://localhost:50753/MyCompany/Login 

我尝试了多种不同的网址,但没有奏效。

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路由(如果可能,或者如果我以错误的方式思考)?

回答

7

您遇到的问题是由于这两个路由匹配所有定义了1,2或3段的URL(因为控制器和操作具有默认值)。由于路线是按照从顶部路线到底部路线的顺序执行的,因此您的顶级路线将始终与匹配,并且您的底部路线绝不会与匹配(主页除外)。

由于顶部路线总是匹配,因此假设第一个段是控制器而第二个段是动作的URL将失败,因为您将这些值分别放入companyNamecontroller路由键中。

为了达到您的预期效果,您需要制定一个能够识别所有公司名称的路径约束。

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的一个或多个段来使匹配唯一。

url: "{companyName}/Login" 

的想法是必须有让你在某些情况下定义匹配的第一个路由一些方式。

或者,您可以实现RouteBase,但只需要您比对此简单场景需要更多的对匹配过程的控制。

+0

Ty for help out :) – Salman 2015-03-03 06:38:19

1

问题是没有办法区分你的两条路线。例如/ a/b/c可以是公司= a,控制器= b,动作= c的默认路由,或者它可以是控制器= a,动作= b,id = c的登录路由。

为了解决这个问题,你需要设计你的路由,包括AJAX的路由,这样两个路由都不可能有相同的URL。在你的例子中,你可以从登录路由中删除/ {id},因为它不是必需的。还要更具体地指定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的/登录和/ MyCompany的/登录/指数将去到登录页面。但是,MyCompany/Home/Index会转到controller = Home,action = Index。

个人而言,我倾向于完全删除默认路由,因此我可以指定所需的URL而不是将它们全部设置为/ controller/action。这给你更多的控制,但意味着分别指定每个路线。

+0

Ty for help – Salman 2015-03-03 06:38:29