ASP.net MVC模型嵌套路由

ian*_*n93 4 c# asp.net-mvc asp.net-mvc-5

考虑一个带有两个模型的ASP.net MVC应用程序:假设公司和人员.每家公司都有一份人员名单.每个人只属于一家公司.

如果您设置模型并使用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" }
);
Run Code Online (Sandbox Code Playgroud)

但它仍然无法正常工作.如果我去/公司/ 7 /人,我得到的人的指标,但/公司/ 7 /人/创建几乎给出了同样的指标,而"新建"链接指向/人/创建的不是/公司/ 7 /人/创建

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

Eri*_*sch 5

嗯,它不会像你想的那样工作.原因是你有两个不同的控制器,公司和人.你不能同时打电话给他们两个.

您将不得不决定是要在人员控制器上编辑人员,还是在公司控制器上编辑人员.就个人而言,我会在人员级别编辑此人,但这意味着您的Person.Edit方法必须采用companyId以及人员ID.

所以你会创建一个这样的路线:

routes.MapRoute(
    "CompanyPerson",                                // Route name
    "Company/{companyId}/Person/{personId}"         // URL with parameters
    new { controller = "Person", action = "Edit" }  // Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)

然后你的Person.Edit方法看起来像这样:

public ActionResult Edit(int companyId, int personId) {}
Run Code Online (Sandbox Code Playgroud)

编辑:

您将不得不使用约束来执行您想要的操作.

routes.MapRoute(
    name: "CompanyPerson",
    url: "Company/{companyId}/Person/{personId}/{action}",
    defaults: new { controller = "Person", action = "Index", PersonId = UrlParameter.Optional },
    new {personId = @"\d+" }
);
Run Code Online (Sandbox Code Playgroud)

但是,现在这意味着您可以执行/ Company/7/Person/15/Create,这就没有任何意义.personId将被忽略.

至于为什么你的创建链接不起作用,是因为id在行动之前.你还需要另一条路线.

routes.MapRoute(
    name: "CompanyPerson",
    url: "Company/{companyId}/Person/Create",
    defaults: new { controller = "Person", action = "Create" }
);
Run Code Online (Sandbox Code Playgroud)

还有这个

@Html.ActionLink("Create", "Person", new { companyId = Model.companyId })
Run Code Online (Sandbox Code Playgroud)

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