考虑一个包含两个模型的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框架?
答案 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#变量并且区分大小写。