簡體   English   中英

ASP.net MVC模型嵌套路由

[英]ASP.net MVC model nesting routes

考慮一個帶有兩個模型的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 /人/創建

是否有一種方法可以顯式設置所有路由,如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
);

然后你的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#變量並且區分大小寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM