小问题,但它让我疯了。
我正在构建一个<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>
问题在于渲染时,&
字符会被&
替换:
<script src='http://example.com/page.aspx?a=xxx&b=zzz&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不能接受它!
答案 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转换为&
;因为那是在网络上显示该字符的代码。
您可以在这个问题的答案中找到答案: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这个数据,从而避免双重编码。您应该总是使用较新的<%:
并且几乎从不使用较旧的<%=
...但当然会有例外情况。
更多细节可在此处获取:
答案 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">