Как добавить URL-адрес сценария, содержащий амперсанд, в ASP.NET? - PullRequest
4 голосов
/ 03 февраля 2010

У меня есть серверный элемент управления, который должен программно вставлять ссылку JavaScript на страницу. Он ссылается на элемент управления картой Bing от Microsoft, который требует добавления &s=1 к URL-адресу скрипта для использования через SSL. Проблема заключается в том, что .NET Framework кодирует атрибуты и изменяет & на & (проверено с помощью Reflector). В какой-то момент после этого & полностью удаляется.

Желаемый тег сценария:

<script type="text/javascript"
  src="https://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&s=1">
</script>

Попытка 1:

var clientScriptManager = this.Page.ClientScript;
if (!clientScriptManager.IsClientScriptIncludeRegistered(this.GetType(), "BingMapControl"))
{
 clientScriptManager.RegisterClientScriptInclude(
  this.GetType(), "BingMapControl",
  "https://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&s=1");
}

Попытка 2:

HtmlGenericControl include = new HtmlGenericControl("script");
include.Attributes.Add("type", "text/javascript");
include.Attributes.Add("src",
 "https://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&s=1");
this.Page.Header.Controls.Add(include);

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 03 февраля 2010

Желаемый тег сценария:

SRC = "https://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&s=1">

На самом деле нет. Фактически, ваш желаемый тег script:

<script type="text/javascript" 
    src="https://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&amp;s=1">
</script>

Вы делаете хотите, чтобы код & был закодирован как &amp;. Зачем? Потому что в стандарте HTML так сказано. См., Например, Раздел C.12. Использование амперсандов в значениях атрибутов (и в других местах) стандарта XHTML 1.0:

Чтобы обеспечить совместимость документов с историческими пользовательскими агентами HTML и пользовательскими агентами на основе XML, амперсанды, используемые в документе, которые должны рассматриваться как литеральные символы, должны быть выражены как ссылка на сущность (например, &amp; «). Например, когда атрибут href элемента a относится к сценарию CGI, который принимает параметры, он должен быть выражен как http://my.site.dom/cgi-bin/myscript.pl?class=guest&amp;name=user, а не как http://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user.

0 голосов
/ 03 февраля 2010

Кажется, что все элементы управления, добавленные в заголовок, являются html.encode-d Page.Header.Controls.Add

Быстрое решение заключается в добавлении свойства ScriptUrl

public string ScriptUrl<br> {<br> get<br> {<br> return "https://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&s=1";<br> }<br> }

и в aspx

<head runat="server"><br> <title></title><br> <script type="text/javascript" src="<%= ScriptUrl %>"></script><br> </head>

И это все

0 голосов
/ 03 февраля 2010

Из любопытства ... этот код всего лишь пример? Обычно я использую RegisterClientScript и тому подобное, только если есть динамическая часть, которая должна быть установлена ​​во время выполнения. В противном случае вы можете просто записать его статически в файл aspx, ascx или js.

Вы пробовали буквальный контроль? Я знаю, что недавно сделал именно это. Мне придется выкопать мой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...