Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Routes mvc 4中添加公司名称_C#_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

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

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

我一直在尝试为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路由(如果可能的话,或者如果我的想法不正确的话)来完成吗

问题是无法区分您的两条路线。例如/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帮助我:)