首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET MVC模型嵌套路由

ASP.NET MVC模型嵌套路由
EN

Stack Overflow用户
提问于 2014-07-05 17:29:17
回答 1查看 2.7K关注 0票数 5

考虑有两个模型的ASP.NET MVC应用程序:比方说CompanyPerson。每家公司都有一份人员名单。每个人只属于一家公司。

如果您建立模型并使用Visual生成控制器/视图,则可以在/Company/{id}等地编辑公司,并在/Person/{id}等地编辑人员。

但我希望它是这样的,你只能添加一个人在一个公司,即你将编辑的人在/Company/{id}/Persons/{id}

如何在ASP.NET MVC 5中设置这种路由?

编辑:

所以我在我的路线上做了这个:

代码语言:javascript
复制
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框架?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-05 17:54:56

它不像你想的那样起作用。原因是您有两个不同的控制器,CompanyPerson。你不能同时给他们打电话。

您必须决定是在Person控制器上编辑一个人,还是在Company控制器上编辑他们。就我个人而言,我会在person级别编辑person,但这意味着您的Person.Edit方法将不得不接受companyIdpersonId

然后创建一条这样的路线:

代码语言:javascript
复制
routes.MapRoute(
    "CompanyPerson",                                // Route name
    "Company/{companyId}/Person/{personId}",        // URL with parameters
    new { controller = "Person", action = "Edit" }  // Parameter defaults
);

那么您的Person.Edit方法将如下所示:

代码语言:javascript
复制
public ActionResult Edit(int companyId, int personId) {}

编辑:

你将不得不使用约束来做你想做的事情。

代码语言:javascript
复制
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在操作之前。你还需要另一条路。

代码语言:javascript
复制
routes.MapRoute(
    name: "CompanyPerson",
    url: "Company/{companyId}/Person/Create",
    defaults: new { controller = "Person", action = "Create" }
);

还有这个

代码语言:javascript
复制
@Html.ActionLink("Create", "Person", new { companyId = Model.companyId })

如果你在行动结束后坚持使用Id,那就容易多了。您还需要小心地将变量名大写,因为这些变量是C#变量,并且区分大小写。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24588888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档