c# - 在 Routes mvc 4 中添加公司名称

标签 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 = "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 将失败,因为您将这些值放入 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 的 1 个或多个片段来使匹配唯一。

url: "{companyName}/Login"

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

或者,您可以实现 RouteBase ,但只有当您需要比这个简单的场景更多地控制匹配过程时才需要这样做。

关于c# - 在 Routes mvc 4 中添加公司名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28812432/

相关文章:

c# - 我正在尝试使用 C# 中的 PHP SOAP 服务并在 VS 2010 中创建类包装器

javascript - 如何获取显示为超链接的图像的 ID

javascript - 在不返回服务器的情况下动态加载图像的最佳方法是什么?

asp.net-mvc - Razor MVC4 Url.Action 不起作用

asp.net-mvc - 是否可以基于子域创建 ASP.NET MVC 路由?

c# - 如何在 DevExpress XtraCharts 中显示动态标记?

c# - SQL 查询错误

c# - 用MVC和Web API注册路由的方式之间有什么区别?

c# - 文本到日期转换错误 C#

javascript - 如何在 JQuery DataTable 中单击按钮时显示警报?