【问题标题】:Hide querystring parameter name from an URL generated with Html.ActionLink in MVC从在 MVC 中使用 Html.ActionLink 生成的 URL 中隐藏查询字符串参数名称
【发布时间】:2014-01-19 21:35:07
【问题描述】:

我正在使用 Html.ActionLink 生成链接。

@Html.ActionLink(item.Text, item.Author.UniqueName, "Author", new { selectedQuoteId = item.QuoteID }, null)

但是当我使用这种方法时,生成的链接是:

http://localhost/Author/aeschylus?selectedQuoteId=1627

但我希望它是:

http://localhost/Author/aeschylus/1627

我的配置是:

routes.MapRoute( "作者语录", "作者/{authorUniqueName}/{selectedQuoteId}", 新的 { 控制器 = "作者名言", 动作=“索引”, authorUniqueName = UrlParameter.Optional, selectedQuoteId = UrlParameter.Optional });

这可以用 Html.ActionLink 做到这一点吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing


    【解决方案1】:

    确保您已将此自定义路由放在默认路由之前。此外,您似乎忘记为路线的 authorUniqueName 部分提供值。由于这不是路由模式的最后一部分,因此它不能是可选的。

    所以从修正你的路线定义开始:

    routes.MapRoute(
        "AuthorQuotes", 
        "Author/{authorUniqueName}/{selectedQuoteId}", 
        new { 
            controller = "AuthorQuotes", 
            action = "Index", 
            selectedQuoteId = UrlParameter.Optional 
        }
    );
    

    然后为这个必需的参数提供一个值:

    @Html.ActionLink(
        item.Text, 
        item.Author.UniqueName, 
        "Author", 
        new { 
            authorUniqueName = item.Author.UniqueName,
            selectedQuoteId = item.QuoteID 
        }, 
        null
    )
    

    基本上,如果您想在路由中包含可选参数,则只能是最后一个。如果您需要多个可选参数,请使用查询字符串(就像您一样),否则路由引擎无法消除它们之间的歧义。

    【讨论】:

    • 另一个问题是我使用“item.Author.UniqueName”而不是“index”作为操作。并且“作者”而不是“AuthorQuotes”作为控制器。所以我认为路由引擎只是跳过了我的路由,然后直接进入默认路由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多