【问题标题】:Why is Html.Raw escaping ampersand in anchor tag in ASP.NET MVC 4?为什么 Html.Raw 在 ASP.NET MVC 4 的锚标记中转义 & 符号?
【发布时间】:2012-08-11 09:40:18
【问题描述】:

我有一个 URL,我想在 Razor 视图中按原样呈现在锚标记中。我会认为 Html.Raw 会是要走的路:

@{
    string test = "http://someurl.com/someimage.png?a=1234&b=5678";
}

<div>
    <a href="@Html.Raw(test)">Test</a>
</div>

但这不起作用。 & 符号被编码,HTML 呈现为:

<div>
    <a href="http://someurl.com/someimage.png?a=1234&amp;b=5678">Test</a>
</div>

奇怪的是,如果我在锚标记之外进行 Html.Raw 调用,则 HTML 输出符合预期:

<div>
    @Html.Raw(test)
<div>

呈现为:

<div>
    http://someurl.com/someimage.png?a=1234&b=5678
</div>

谁能解释这是为什么?

编辑:

尝试了其他一些东西,发现以下工作正常:

<div data-url="@Html.Raw(test)"></div>

输出:

<div data-url="http://someurl.com/someimage.png?a=1234&b=5678"></div>

为了添加更多上下文,我的目标实际上并不是在锚标记中使用 URL,因为 hrefs 可以进行 HTML 编码并且仍然可以工作(我只是使用了锚标记案例为例)。相反,我希望在 Flash 对象的 &lt;object&gt; &lt;param&gt; 值标记中使用 URL。 Flash 对象无法正确识别 HTML 编码的 URL,但我无法正确输出原始 URL。

我很茫然。我猜是时候破解 MVC 源代码了……

【问题讨论】:

标签: razor asp.net-mvc-4


【解决方案1】:

发生这种情况是因为管道中的某些东西(我猜是剃刀,但我需要查找它)属性对所有属性值进行编码。但是,这不会影响浏览器到达您想要的位置。

您可以使用 @Html.ActionLink(text, action, routeAttributes) 重载进行测试。

@Html.ActionLink("Test", "Index", new { tony = "1", raul = 2 })

输出

<a href="/?tony=1&amp;raul=2">Test</a>

关于您的编辑,您只需将整个 &lt;param&gt; 设为原始值的一部分。

@{
    var test = "<param src=\"http://someurl.com/someimage.png?a=1234&b=5678\">";
}

<div>
    <object>
    @Html.Raw(test)
    </object>
</div>

【讨论】:

  • 这个答案是最新的吗?我刚刚在VS2013,MVC5中尝试了@Html.ActionLink("Test", "Index", new { tony = "1", raul = 2 }),输出为&lt;a href="/?tony=1&amp;raul=2"&gt;Test&lt;/a&gt; ...
【解决方案2】:

像这样:

@{
    string test = "http://someurl.com/someimage.png?a=1234&b=5678";
}

<div>
    <a href="@Html.Raw(Html.AttributeEncode(test))">Test</a>
</div>

产生有效的标记:

<div>
    <a href="http://someurl.com/someimage.png?a=1234&amp;b=5678">Test</a>
</div>

但这不起作用。 & 符号被编码,HTML 是 呈现为:

但这正是有效标记的外观。当用作属性时,必须对 & 符号进行编码。不用担心,浏览器会完全理解这个 url。

请注意,以下是无效标记,因此您不希望这样做:

<div>
    <a href="http://someurl.com/someimage.png?a=1234&b=5678">Test</a>
</div>

【讨论】:

  • 该示例具有误导性,他试图对 flash 对象使用 &lt;object&gt;&lt;param .../&gt;&lt;/object&gt; 设置,但他认为它没有正确获取值(可能在 flash 中进行双重编码?)
  • @NickLarsen,但以下是无效标记&lt;param name="test" value="http://someurl.com/someimage.png?a=1234&amp;b=5678" /&gt;。尝试任何 HTML 验证器,它会告诉你这一点。为什么有人要生成无效标记?如果 Flash 影片无法识别有效标记,则可能需要修复此 Flash 影片。
  • 这是一个好点,除非他无权更改闪存部分。
  • @NickLarsen,在这种情况下,我会联系这个 Flash 插件的作者,通知他们这个错误并要求他们修复它。我宁愿这样,而不是在我的网站上写无效的标记。
  • 奇怪的是,您的示例可能暴露了 Razor 中 others are experiencing 的错误。它似乎没有产生预期的标记。如果您在结果中查看源代码,则会对其进行两次编码:&lt;a href="http://someurl.com/someimage.png?a=1234&amp;amp;amp;b=5678"&gt;Test&lt;/a&gt;
【解决方案3】:

试试

<div>
    <a href="@MvcHtmlString.Create(test)">Test</a>
</div>

【讨论】:

  • 不走运。我得到与 Html.Raw() 相同的行为。
  • @JoeWaller 起初对我不起作用,但在我将 Razor 和 MVC 更新到最新版本之后(这很痛苦,因为它破坏了东西......)然后是 Html.Raw() 和 MvcHtmlString。 Create() 确实有效。
【解决方案4】:

试试下面... 它工作完美。

@{
    string test = "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token="+@ViewBag.Token;
}
<div>
    <a href="@Html.Raw(System.Web.HttpUtility.HtmlDecode(test))">@Html.Raw(System.Web.HttpUtility.HtmlDecode(test))</a>
</div>

【讨论】:

    【解决方案5】:

    你为什么不使用jquery来发布url:

        $(function () {
        $('form').submit(function () {
            $.ajax({
                url: this.action,
                type: this.method,
                data: { a:'firstvalue', b: 'secondvalue'},
                success: function (result) {
    //code for successful result
                }
            });
            return false;
        });
    });
    

    在控制器中

    public ActionResult Fetch(string a, string b)
        {
            //write required codes here
                return View();
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 2010-09-21
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      相关资源
      最近更新 更多