Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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# ASP.net MVC模型嵌套路由_C#_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

C# ASP.net MVC模型嵌套路由

C# ASP.net MVC模型嵌套路由,c#,asp.net-mvc,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 5,考虑一个具有两种模型的ASP.NETMVC应用程序:比如说公司和个人。每家公司都有一份人员名单。每个人只属于一家公司 如果设置模型并使用Visual Studio生成控制器/视图,则可以在/Company/{id}等处编辑公司,也可以在/Person/{id}等处编辑人员 但是我希望它是这样的,您只能在公司内部添加一个人,即您可以在/company/{id}/persons/{id}编辑人员 如何在ASP.net MVC 5中设置这种路由 编辑: 所以我在我的路线上这样做: routes.Ig

考虑一个具有两种模型的ASP.NETMVC应用程序:比如说公司和个人。每家公司都有一份人员名单。每个人只属于一家公司

如果设置模型并使用Visual Studio生成控制器/视图,则可以在/Company/{id}等处编辑公司,也可以在/Person/{id}等处编辑人员

但是我希望它是这样的,您只能在公司内部添加一个人,即您可以在/company/{id}/persons/{id}编辑人员

如何在ASP.net MVC 5中设置这种路由


编辑:

所以我在我的路线上这样做:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
    name: "CompanyPerson",
    url: "Company/{CompanyId}/Person/{PersonId}/{action}",
    defaults: new { controller = "Person", action = "Index", PersonId = UrlParameter.Optional }
);

routes.MapRoute(
    name: "Company",
    url: "Company/{id}/{action}",
    defaults: new { controller = "Company", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/",
    defaults: new { controller = "Home", action = "Index" }
);
但它仍然不起作用。如果我转到/Company/7/Person,我会得到一个persons索引,但是/Company/7/Person/Create只给出了相同的索引,“createnew”链接指向/Person/Create,而不是/Company/7/Person/Create


是否有一种方法可以像Node或大多数其他MVC框架那样显式设置所有路由?

好吧,它没有按照您的想法工作。原因是你有两个不同的控制器,公司和个人。你不能同时给他们打电话

您必须决定是要在人员控制器上编辑人员,还是要在公司控制器上编辑人员。就个人而言,我会在person级别编辑person,但这将意味着您的person。编辑方法必须采用companyId和person Id

因此,您将创建一条如下所示的路线:

routes.MapRoute(
    "CompanyPerson",                                // Route name
    "Company/{companyId}/Person/{personId}"         // URL with parameters
    new { controller = "Person", action = "Edit" }  // Parameter defaults
);
public ActionResult Edit(int companyId, int personId) {}
然后您的Person.Edit方法将如下所示:

routes.MapRoute(
    "CompanyPerson",                                // Route name
    "Company/{companyId}/Person/{personId}"         // URL with parameters
    new { controller = "Person", action = "Edit" }  // Parameter defaults
);
public ActionResult Edit(int companyId, int personId) {}
编辑:

您将不得不使用约束来做您想要做的事情

routes.MapRoute(
    name: "CompanyPerson",
    url: "Company/{companyId}/Person/{personId}/{action}",
    defaults: new { controller = "Person", action = "Index", PersonId = UrlParameter.Optional },
    new {personId = @"\d+" }
);
然而,现在这意味着你可以做/Company/7/Person/15/Create,这毫无意义。personId将被忽略

至于创建链接不起作用的原因,是因为id在操作之前。你还需要另一条路线

routes.MapRoute(
    name: "CompanyPerson",
    url: "Company/{companyId}/Person/Create",
    defaults: new { controller = "Person", action = "Create" }
);
还有这个

@Html.ActionLink("Create", "Person", new { companyId = Model.companyId })

如果你在行动后坚持使用Id,那会容易得多。您还需要注意将变量名大写,因为它们是c#变量,并且区分大小写。

所以您只想搞乱URL?是的,此人应该自动与当前公司关联。谢谢。我就是这么想的。对不起。它仍然不起作用。给我一分钟,我会更新这个问题。@ian93-它不起作用,因为你把它完全改成了别的东西。你不能让personId成为可选的,如果后面有东西,匹配的模式将无法识别。谢谢,我不知道如果后面有东西,你不能让它成为可选的。对不起@ian93-如果你使用约束忽略不是数字的路线,你可以这样做,就像我上面做的那样。。但是,您需要一个单独的路由来处理不存在id的Create情况。