使用Url.Action的特定路线

时间:2014-02-14 19:44:56

标签: c# .net asp.net-mvc asp.net-mvc-4 routes

我在路线配置中声明了两条路线,如下所示:

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?或者有没有其他方法可以避免在网址中出现这个短划线?

2 个答案:

答案 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参数是可选的,这就是为什么我的解决方案是改变路由顺序。