[英]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
嗎? 或者有沒有其他方法可以避免在網址中出現這個短划線?
嘗試更改路線的順序。 把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.