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框架?
嗯,它不会像你想的那样工作.原因是你有两个不同的控制器,公司和人.你不能同时打电话给他们两个.
您将不得不决定是要在人员控制器上编辑人员,还是在公司控制器上编辑人员.就个人而言,我会在人员级别编辑此人,但这意味着您的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#变量并且区分大小写.