11

小问题,但它仍然让我发疯。

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

<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>

但是,如果我直接在标签之外渲染 url <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

是什么赋予了?我该如何阻止这种疯狂?我的强迫症受不了!

4

6 回答 6

7

正如@Falkon 和@AVD 所说,ASP.NET 会自动在<script>标签中做“正确”的事情。请参阅 w3c 建议 - C.12。在属性值(和其他地方)中使用与号

为了确保文档与历史 HTML 用户代理和基于 XML 的用户代理兼容,在文档中使用的要被视为文字字符的 & 符号必须将其自身表示为实体引用(例如“ &amp;”)。

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

于 2013-01-05T04:09:20.053 回答
2

也许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>
于 2013-01-05T04:07:30.490 回答
1

我可以解决。我只是做了一个方法:

    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">
于 2013-08-06T07:34:00.470 回答
0

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

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

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

于 2012-12-06T06:13:44.037 回答
0

围绕评论使用Server.HtmlEncode( yourString )

它会自动为您转义双引号或单引号,以及与号 (&) 和小于号和大于号等。

于 2012-12-06T06:15:59.650 回答
0

尝试<%=使用<$:. 这是 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

于 2013-01-05T04:13:14.127 回答