使用Url.Action指定路由

4

我的路由配置中声明了两个路由,如下所示:

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中出现这个破折号?

1
路由表不会影响Url.Action如何呈现URL...因此您的链接将呈现为<a href="http://site/Main/TheAction/-"> - Mister Epic
@ChrisHardie 是的,我只是想避免那种情况。 - Mansfield
奇怪...当你在视图中添加这个内容时会渲染出什么:<a href="@Url.Action("TheAction")">The Action</a> - Mister Epic
@ChrisHardie 同样的事情... - Mansfield
http://site 是从哪里来的? - Mister Epic
@ChrisHardie 抱歉,它并没有直接说“站点”。我只是想避免使用破折号。 - Mansfield
2个回答

12
发现重复问题这里 简而言之,使用Url.RouteUrl() 而不是 Url.Action()来获得正确的URL。
在你的情况下,如果愿意,你甚至可以使用@Html.RouteLink()来获得整个锚标签。

4
尝试更改您的路由顺序。像下面这样将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 参数是可选的,这就是为什么我的解决方案是改变路线顺序。


@Lin,您能详细说明路由表映射如何影响Url.Action生成URL的方式,以便在URL末尾添加破折号吗? - Mister Epic
@ChrisHardie,我更新了答案并添加了更多细节,请看一下。 - Lin
好的,问题是如何使用特定路由,而不是如何设置路由。这并没有回答问题。 - d.popov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接