【问题标题】:Use a specific route with Url.Action使用带有 Url.Action 的特定路由
【发布时间】:2014-03-14 08:07:37
【问题描述】:

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

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.Action如何呈现一个URL...所以你的链接呈现为&lt;a href="http://site/Main/TheAction/-"&gt;?
  • @ChrisHardie 是的,我只是想避免这种情况。
  • 奇数...当您将此添加到您的视图时呈现的内容:&lt;a href="@Url.Action("TheAction")"&gt;The Action&lt;/a&gt;
  • @ChrisHardie 同样...
  • http://site 来自哪里?

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


【解决方案1】:

发现重复问题here

简而言之,使用 Url.RouteUrl() 而不是 Url.Action() 来获取正确的 URL。

如果你愿意,你甚至可以使用@Html.RouteLink() 来获取整个锚标记。

【讨论】:

    【解决方案2】:

    尝试更改路线的顺序。将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 以附加破折号的详细信息?
    • @ChrisHardie,我更新了答案以获得更多细节,看看。
    • 嗯,问题是如何使用特定路由,而不是如何设置路由。这没有回答问题。
    猜你喜欢
    • 2016-07-16
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多