簡體   English   中英

在區域中使用RouteLink

[英]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都會使用當前存在的值。 在這種情況下,由於actioncontroller值為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.

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