为什么Html.Raw在ASP.NET MVC 4中转义锚标记中的&符号?

Joe*_*ler 17 razor asp.net-mvc-4

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

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

<div>
    <a href="@Html.Raw(test)">Test</a>
</div>
Run Code Online (Sandbox Code Playgroud)

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

<div>
    <a href="http://someurl.com/someimage.png?a=1234&amp;b=5678">Test</a>
</div>
Run Code Online (Sandbox Code Playgroud)

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

<div>
    @Html.Raw(test)
<div>
Run Code Online (Sandbox Code Playgroud)

呈现为:

<div>
    http://someurl.com/someimage.png?a=1234&b=5678
</div>
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么会这样?

编辑:

尝试了其他一些事情,发现以下工作符合预期:

<div data-url="@Html.Raw(test)"></div>
Run Code Online (Sandbox Code Playgroud)

输出:

<div data-url="http://someurl.com/someimage.png?a=1234&b=5678"></div>
Run Code Online (Sandbox Code Playgroud)

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

我很茫然.是时候打破MVC源代码我猜...

Nic*_*sen 11

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

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

@Html.ActionLink("Test", "Index", new { tony = "1", raul = 2 })
Run Code Online (Sandbox Code Playgroud)

输出

<a href="/?tony=1&amp;raul=2">Test</a>
Run Code Online (Sandbox Code Playgroud)

关于编辑,您只需要制作<param>原始值的全部内容.

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

<div>
    <object>
    @Html.Raw(test)
    </object>
</div>
Run Code Online (Sandbox Code Playgroud)