考虑有两个模型的ASP.NET MVC应用程序:比方说Company和Person。每家公司都有一份人员名单。每个人只属于一家公司。
如果您建立模型并使用Visual生成控制器/视图,则可以在/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框架?
发布于 2014-07-05 17:54:56
它不像你想的那样起作用。原因是您有两个不同的控制器,Company和Person。你不能同时给他们打电话。
您必须决定是在Person控制器上编辑一个人,还是在Company控制器上编辑他们。就我个人而言,我会在person级别编辑person,但这意味着您的Person.Edit方法将不得不接受companyId和personId。
然后创建一条这样的路线:
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#变量,并且区分大小写。
https://stackoverflow.com/questions/24588888
复制相似问题