【问题标题】:How to pass special character via url in ASP.NET MVC?如何在 ASP.NET MVC 中通过 url 传递特殊字符?
【发布时间】:2015-02-03 18:01:33
【问题描述】:

我想要一个 url 链接,例如:/Posts/Post/1#cmets

其中:Posts - 控制器名称,Post - 操作名称,1 - id 参数

我在我的视图中使用以下代码:

<a href="@Url.Action("Post", "Posts", new { id = @item.PostId + "#comments" })">Comments</a>

结果我有:/Posts/Post/1%23cmets

如何传递 '#' 字符而不是 "%23"?

【问题讨论】:

    标签: c# asp.net-mvc fragment-identifier


    【解决方案1】:

    要使该数据成为动作的一部分,%23 是正确的;如果# 代表一个片段 - 它不是“动作”的一部分。 url 中的 # 表示客户端片段 - 通常用于通过 id 跳转到文档中的元素(服务器在 url 中的 # 之后永远不会看到任何内容)

    另见:(查看网址)

    【讨论】:

    • 是的,但其实我是想跳转到文档中的一个元素...问题是怎么做?
    • @user1334190 then: 这不是“动作”的一部分,因为动作是服务器端的,而服务器永远不会看到片段;分别添加#commentshref="@(Url.Action(...))#comments"
    • href="@(Url.Action(...))#cmets" 是一个简单的解决方案。谢谢!
    【解决方案2】:

    您正在寻找:

    <a href="@Url.Action("Post", "Posts", new { id = item.PostId })#comments" ...></a>
    

    # 用于散列,因此将其发送到服务器端(Url.Action 期望)意味着对其进行编码。如果您希望补充客户体验,请不要将其包含在您的 Url.Action 中(或创建一个特殊的重载来接受片段标识符并原封不动地输出)。

    【讨论】:

    • 这就是我的问题的答案。谢谢!
    • 技术上:“片段标识符”,而不是散列
    • @MarcGravell:番茄番茄。我想我给它分组了JavaScript API 标签它“散列”(即使它是一个散列+片段)。但我已经重新措辞了。 ;-)
    【解决方案3】:

    您也可以在适当的超载(fragment 参数)下使用Html.ActionLink,而不是手动构建链接。

    @Html.ActionLink(
               "Comments", 
               "Post", 
               "Posts", null, null, 
               "comments", // fragment part
               new { id = @item.PostId }, 
               new { })
    
    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2015-11-22
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多