ASP.net MVC模型嵌套路由

时间:2014-07-05 17:29:18

标签: 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" }
);

但它仍然无法正常工作。如果我去/ Company / 7 / Person我得到一个人的索引,但/ Company / 7 / Person / Create只给出相同的索引,并且" Create New"链接指向/ Person / Create而不是/ Company / 7 / Person / Create

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

1 个答案:

答案 0 :(得分:5)

嗯,它没有按照你的思维方式运作。原因是你有两个不同的控制器,公司和人。你不能同时打电话给他们。

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

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

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

然后你的Person.Edit方法如下所示:

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#变量并且区分大小写。