在Routes mvc 4中添加公司名称

时间:2015-03-02 14:39:01

标签: c# asp.net-mvc asp.net-mvc-routing

我一直在努力为Facebook等用户提供选项,以便在网址中添加公司名称:

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

2 个答案:

答案 0 :(得分: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: "{companyName}/Login"

我们的想法是必须有一些方法,以便在某些情况下使您定义的第一条路线匹配。

或者,你可以实现RouteBase,但是你只需要比这个简单的场景更需要对匹配过程的控制。

答案 1 :(得分:1)

问题是没有办法区分你的两条路线。例如/ a / b / c可以是默认路由,其中​​company = a,controller = b,action = c,或者它可以是具有controller = a,action = b,id = c的Login路由。

要解决此问题,您需要设计路线,包括AJAX路线,这样两条路线就无法拥有相同的路径。在您的示例中,您可以从登录路由中删除/ {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 / Login和/ MyCompany / Login / Index都将转到登录页面。但是MyCompany / Home / Index会转到controller = Home,action = Index。

就个人而言,我倾向于完全删除默认路由,因此我可以指定我想要的URL,而不是将它们全部作为/ controller / action。这为您提供了更多控制权,但确实意味着单独指定每条路线。