簡體   English   中英

使用Url.Action的特定路線

[英]Use a specific route with Url.Action

我在路由配置中聲明了兩條路由,如下所示:

routes.MapRoute(
    name: "SpecificAction",
    url: "{controller}/{action}/{id}-{id2}",
    defaults: new { controller = "Main", action = "SpecificAction", id = UrlParameter.Optional, id2 = UrlParameter.Optional }
);

routes.MapRoute(
    name: "DefaultNoParams",
    url: "{controller}/{action}/",
    defaults: new { controller = "Main", Action = "Index" },
    namespaces: new string[1] { "Project.Controllers" }
);

我有兩個控制器動作,如下所示:

[HttpGet]
public ActionResult TheAction()
{

}

[HttpPost]
public ActionResult TheAction([ModelBinder(typeof(SpecificModelBinder))] SpecificModel model)
{

}

我希望在我的視圖中鏈接到第一個這些操作,因此我使用Url.Action生成一個:

<a href="@Url.Action("TheAction", "Main")">The Action</a>

但是,這會輸出url http://site/Main/TheAction/- (注意末尾的破折號,這似乎表明我正在使用我的SpecificAction路線。

有什么方法可以用特定路線調用Url.Action嗎? 或者有沒有其他方法可以避免在網址中出現這個短划線?

這里有重復的問題

簡而言之,使用Url.RouteUrl()Url.Action()來獲取正確的URL。

在您的情況下,如果您願意,甚至可以使用@Html.RouteLink()來獲取整個錨標記。

嘗試更改路線的順序。 SpecificAction路線后DefaultNoParams像下面的路線:

routes.MapRoute(
    name: "DefaultNoParams",
    url: "{controller}/{action}/",
    defaults: new { controller = "Main", Action = "Index" },
    namespaces: new string[1] { "Project.Controllers" }
);

routes.MapRoute(
    name: "SpecificAction",
    url: "{controller}/{action}/{id}-{id2}",
    defaults: new { controller = "Main", action = "SpecificAction", id = UrlParameter.Optional, id2 = UrlParameter.Optional }
);

更新:回答以下要求的問題:

您能否提供一些關於路由表映射如何影響Url.Action如何生成URL以便添加破折號的詳細信息?

首先,OP在視圖中使用以下代碼:

 <a href="@Url.Action("TheAction", "Main")">The Action</a>

它產生:

 <a href="/Main/TheAction">The Action</a>

存在破折號的原因是因為兩個id參數都是可選的,因此如果沒有兩個id,則只有破折號並且它滿足以下路線條件。

routes.MapRoute(
            name: "SpecificAction",
            url: "{controller}/{action}/{id}-{id2}",
            defaults: new { controller = "Main", action = "SpecificAction", 
            id = UrlParameter.Optional, id2 = UrlParameter.Optional }
    );

如果其中一個ID不是可選的,它將繼續檢查下一個路徑。 但是OP需要id參數是可選的,這就是為什么我的解決方案是改變路由順序。

暫無
暫無

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

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