我在路线配置中声明了两条路线,如下所示:
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>
但是,这会输出网址http://site/Main/TheAction/-
(请注意结尾处的短划线,这似乎表示正在使用我的SpecificAction
路线。
我是否可以通过特定路线呼叫Url.Action
?或者有没有其他方法可以避免在网址中出现这个短划线?
答案 0 :(得分:7)
找到重复的问题here
简而言之,请使用Url.RouteUrl()
代替Url.Action()
来获取正确的网址。
在您的情况下,如果您愿意,甚至可以使用@Html.RouteLink()
来获取整个锚标记。
答案 1 :(得分:3)
尝试更改路线的顺序。将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参数是可选的,这就是为什么我的解决方案是改变路由顺序。