[英]Using RouteLink with Areas
在我的MVC應用程序中,我定義了默認路由:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new []{ "Demo.Controllers" }
);
我創建了一個名為Admin的新區域,並在AdminAreaRegistration類中添加了的路由:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", controller = "Home", id = UrlParameter.Optional }
);
}
在我的主要_Layout文件中,我嘗試執行以下操作:
@Html.RouteLink("Admin", "Admin_default")
它僅在某些情況下有效(例如,如果我已經在“管理”頁面中)。 如果我位於網站的/ Home / About部分中,則將生成URL,如下所示:
/Admin/Home/About
如果我處於Home控制器的Index動作中(在主區域中,而不是admin),則將生成URL,如下所示:
/Admin
為什么RouteLink無法像我認為的那樣使用MVC中的Areas來工作?
@Html.RouteLink("Admin", "Admin_default")
此路由使用名稱為Admin_default
的路由,因此它將始終使用該路由來生成URL。
@Html.RouteLink("Admin", "Admin_default", new { controller = "Home", action = "Index" })
當您不指定諸如路由值之類的內容時,大多數MVC都會使用當前存在的值。 在這種情況下,由於action
和controller
值為null,因此它將查看RouteValues
並檢查它們是否存在以及是否找到了它們,而是使用在那里找到的值。
這有時很有幫助。 例如,如果您希望{id}
填充頁面上使用的相同值。
網址: /home/edit/1701
@Html.RouteLink("Refresh", "Default")
將產生相同的@Html.RouteLink("Refresh", "Default")
如果需要,您可以指定替代。
我也建議不要命名您的路線。 您可以通過在創建路由名稱arg時將null傳遞給路由名稱arg來強迫自己這樣做。
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(null,
"Admin/{controller}/{action}/{id}",
new { action = "Index", controller = "Home", id = UrlParameter.Optional }
);
}
然后,您可以像下面這樣使用RouteLink:
@Html.RouteLink("Admin",
new { controller = "Home", action = "Index", area = "Admin" })
回復評論
希望我能說出我的主意。 從Steve Sanderson的MVC書中學到了這一點。 有很多方法重載,它們以路由名稱作為參數(RouteLink,還有RedirectToRoute等)。 不使用路由名稱將迫使您使用這些方法的其他重載,這使IMO更直觀,更容易“正確”。
建議不要命名路由,因為它會在視圖中創建對現有路由的依賴關系。 我建議使用空值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.