ASP.NET自动转换&到&

时间:2012-12-06 06:06:54

标签: c# asp.net vb.net html-encode

小问题,但它让我疯了。

我正在构建一个<script>标记包的URL,以便在ASP.NET页面上呈现,如下所示:

<script src='<%= string.Format("http://example.com/page.aspx?a={0}&b={1}&c={2:0.00}", A, B, C)%>' type='text/javascript'></script>

问题在于渲染时,&字符会被&amp;替换:

<script src='http://example.com/page.aspx?a=xxx&amp;b=zzz&amp;c=123.45' type='text/javascript'></script>

我很期待这一点,显然:

<script src='http://example.com/page.aspx?a=xxx&b=zzz&c=123.45' type='text/javascript'></script>

但是,如果我直接在<script>标记之外呈现网址,它看起来还不错!刚做

<%= string.Format("http://example.com/page.aspx?a={0}&b={1}&c={2:0.00}", A, B, C) %>

呈现:

http://example.com/page.aspx?a=xxx&b=zzz&c=123.45

是什么给出的?我该如何制止这种疯狂?我的OCD不能接受它!

6 个答案:

答案 0 :(得分:5)

正如@Falkon和@AVD所说,ASP.NET在<script>标签中自动执行“正确”操作。请参阅w3c建议 - C.12. Using Ampersands in Attribute Values (and Elsewhere)

  

为了确保文档与历史HTML用户代理和基于XML的用户代理兼容,文档中用作文字字符的&符必须表示为实体引用(例如“{{1 }}“)。

我不完全确定为什么ASP.NET在页面的其余部分没有做同样的事情(可能有很多好的理由),但至少它正在纠正脚本标签中的&符号。结论:虽然您可能会诅咒ASP.NET以“扰乱”您的网址,但您可能要感谢它,以帮助您的网页符合标准。

答案 1 :(得分:0)

“&安培;”是HTML和XML中的保留字符,因此是ASP.NET。 “&amp;”由ASP.NET转换为&amp;因为那是在网络上显示该字符的代码。

您可以在这个问题的答案中找到答案:ASP.Net URLEncode Ampersand for use in Query String

希望有所帮助,祝你好运!

答案 2 :(得分:0)

在评论周围使用Server.HtmlEncode( yourString )

它将自动转义双引号或单引号,以及&符号(&amp;)和小于号和大于号的符号等。

答案 3 :(得分:0)

可能MvcHtmlString.Create()Html.Raw()

<script src='<%= MvcHtmlString.Create("http://example.com/page.aspx?a={0}&b={1}&c={2:0.00}", A, B, C)%>' type='text/javascript'></script>

<script src='<%= Html.Raw("http://example.com/page.aspx?a={0}&b={1}&c={2:0.00}", A, B, C)%>' type='text/javascript'></script>

答案 4 :(得分:0)

而不是<%=,有时可以自动HTMLEncode它写入响应流的内容,尝试使用<$:。这是ASP.Net 4.0添加的新(ish)代码表达式块语法。默认情况下,这个新语法仍然会HTMLEncode大部分内容,但是有一个特殊的IHtmlString接口可以用来明确地告诉这个新的块你想要HTMLEncode这个数据,从而避免双重编码。您应该总是使用较新的<%:并且几乎从不使用较旧的<%= ...但当然会有例外情况。

更多细节可在此处获取:

  

http://weblogs.asp.net/scottgu/archive/2010/04/06/new-lt-gt-syntax-for-html-encoding-output-in-asp-net-4-and-asp-net-mvc-2.aspx

答案 5 :(得分:0)

我可以解决这个问题。我只是做一个方法:

    public void BuildUrl(String baseUrl = "", String data = "")
    {
        Response.Write(baseUrl + data);
    }

并在我的html页面中使用它:

<button type="button" class="btn_new" ref="<% this.BuildUrl(this.BaseUrl + "Master/Tanker_Edit.aspx?", "type=new&unique_id=" + Session.SessionID); %>">New</button>

结果:

<button type="button" class="btn_new" ref="http://kideco.local/Master/Tanker_Edit.aspx? type=new&unique_id=emxw1pkpnwcxpn1cl2cf04zv">