在 Mvc 中使用 Html.ActionLink 时如何绕过 HTML 编码?
Posted
技术标签:
【中文标题】在 Mvc 中使用 Html.ActionLink 时如何绕过 HTML 编码?【英文标题】:How do I bypass the HTML encoding when using Html.ActionLink in Mvc? 【发布时间】:2010-09-30 04:35:46 【问题描述】:每当我使用 html.ActionLink 时,它总是 Html 对我的显示字符串进行编码。例如,我希望我的链接看起来像这样:
<a href="/posts/422/My-Post-Title-Here">More…</a>
它的输出如下:More…
&hellip 是 "..." 以防你想知道。
但是,actionlink 输出实际文本“…”作为链接文本。如果我想输出这个,我有同样的问题:
<a href="/posts/422/My-Post-Title-Here"><em>My-Post-Title-Here</em></a>
我最终得到: <em>My-Post-Title-Here</em>
知道怎么做吗?
【问题讨论】:
【参考方案1】:看起来 ActionLink 总是在链接文本上使用调用 HttpUtility.Encode。您可以使用 UrlHelper 生成 href 并自己构建锚标记。
<a href='@Url.Action("Posts", ...)'>More…</a>
或者,您可以“解码”传递给 ActionLink 的字符串。用 HTML 构建链接似乎更具可读性(对我而言)——尤其是在 Razor 中。以下是用于比较的等价物。
@Html.ActionLink(HttpUtility.HtmlDecode("More…"), "Posts", ...)
【讨论】:
@tvanfosson 差不多 4 年后...这仍然是将特殊字符(如&符号、插入符号等)填充到链接文本中的最佳方法吗? @one.beat.consumer 我认为是这样,但我添加了另一种选择。还更新以反映 Razor 语法。 Mvc Html 扩展都是垃圾,为了更强大试试 Fubu MVC 的 HtmlTags 库,然后您可以编写自己的(更好的)扩展方法返回 HtmlTags 而不是 MvcHtmlString 对于 MVC5,他们将 Decode 方法重命名为 HtmlDecode @Html.ActionLink(HttpUtility.HtmlDecode("More…"), "Posts", ...)【参考方案2】:Sam 给出的答案实际上是正确的,我在我的解决方案中使用了它,因此我自己尝试了它。 您可能希望删除多余的括号,使其变为如下所示:
@Html.ActionLink(HttpUtility.HtmlDecode("&"), "Index", "Home")
【讨论】:
【参考方案3】:或者,只需使用普通的 Unicode 省略号字符 \u2026 并让 MVC 担心如何对其进行编码。除非有一些特别令人信服的理由,否则您特别需要一个 hellip 实体引用而不是字符引用,或者只是将字符包含为简单的 UTF-8 字节。
另一种选择:只使用三个句点。省略号 (U+2026) 是一个兼容字符,仅包含在与 pre-Unicode 编码之间的往返行程中。与简单的点相比,它对您的帮助很小。
【讨论】:
省略号在语义上比三个句点更有意义。它通常也渲染得更好。【参考方案4】:看看这个:
<p>Some text @(new HtmlString(stringToPaste)) </p>
【讨论】:
【参考方案5】:在传递值之前对其进行解码。只是遇到了同样的问题(不同的字符),它工作正常:
例如:
@Html.ActionLink(HttpUtility.HtmlDecode(_("&")), "Index", "Home")
虽然很烦
【讨论】:
以上是关于在 Mvc 中使用 Html.ActionLink 时如何绕过 HTML 编码?的主要内容,如果未能解决你的问题,请参考以下文章
带有 mvc 核心的 Ajax.ActionLink 替代方案