Почему URL-адреса кодируются тегами ‹link› внутри ‹head runat = server› и как этого избежать (asp.net)

(Я тестировал это на ванильном сайте asp.net, запущенном с сервера webdev, и здесь тоже проблема):

В моем .master файле есть следующая разметка

<!DOCTYPE html>
<html>
<head runat="server">
    <link href="/Styles/Site.css" rel="stylesheet" type="text/css" />
    <link rel="alternate" type="application/rss+xml" title="rss" href="/Pages/Static/Feed.aspx?type=rss&lang=en" />    
</head>

визуализированный html выглядит так:

<!DOCTYPE html>
<html>
<head>
    <link href="/Styles/Site.css" rel="stylesheet" type="text/css" />
    <link rel="alternate" type="application/rss+xml" title="asdsad" href="/Pages/Static/Feed.aspx?type=rss&amp;lang=en" />
</head>

(RSS-ссылка "&" была закодирована как "&")

однако, если я изменю разметку на

<!DOCTYPE html>
<html>
<head>
    <link href="/Styles/Site.css" rel="stylesheet" type="text/css" />
    <link rel="alternate" type="application/rss+xml" title="rss" href="/Pages/Static/Feed.aspx?type=rss&lang=en" />    
</head>

(нет runat = "server" в теге head), то результирующий html выводится, как и ожидалось:

<!DOCTYPE html>
<html>
<head runat="server">
    <link href="/Styles/Site.css" rel="stylesheet" type="text/css" />
    <link rel="alternate" type="application/rss+xml" title="rss" href="/Pages/Static/Feed.aspx?type=rss&lang=en" />    
</head>

Очевидно, что Asp.Net что-то делает для кодирования URL-адреса. Так получилось, что мне действительно нужно, чтобы тег заголовка был runat = "server", и я также хотел бы иметь возможность иметь "&" в URL-адресах внутри него, есть какой-то трюк, который я могу использовать, чтобы съесть свой торт и съесть его слишком?

Ваш Андреас


person AndreasKnudsen    schedule 04.01.2011    source источник


Ответы (2)


Эта проблема случилась со мной раньше, я не мог понять причину этого, я закончил тем, что поместил литерал в голову и заполнил html из кода позади. html:

<head runat="server">
    <asp:Literal runat="server" ID='litLinks' />
</head>

Код C #:

protected void Page_Load(object sender, EventArgs e)
{
  litLinks.Text = "<link rel='alternate' type='application/rss+xml' title='rss' href='/Pages/Static/Feed.aspx?type=rss&lang=en' />"
                  + "<link href='/Styles/Site.css' rel='stylesheet' type='text/css' />";
}
person Dan    schedule 04.01.2011

Примечание. Если вы собираетесь проголосовать против, объясните, почему, потому что все, что я сказал, не является неправильным, если вы не докажете обратное.

Вы должны избегать амперсандов в URL-адресах, поскольку, помещая неэкранированный амперсанд в URL-адрес, браузер ожидает, что там что-то закодировано. Экранируя его, вы сообщаете браузеру, что это такое, амперсанд.

Он не нарушает ваши ссылки и действителен.

Кроме того, если вы хотите передать фактический амперсанд в URL-адресе, который не определяет новый параметр строки запроса, вы должны URL-адрес закодировать амперсанд как '% 26'

Изменить: поскольку вы, вероятно, используете это каким-то действительно странным образом. Вот почему: это правильно для ASP.Net в HTML. Кодировать амперсанд для HTML-документа.

Когда браузер выдает запрос URL-адреса, он не отправляет запрос URL-адреса в кодировке HTML, он отправляет запрос URL-адреса в кодировке, отличной от HTML.

Если по какой-то причине вы обращаетесь к серверной стороне значения или чему-то еще, вы можете сделать что-то вроде:

var url = new Uri(HttpUtility.HtmlDecode(@"http://www.google.com/somepage.aspx?key1=value1&key2=value2"));
var query = HttpUtility.ParseQueryString(url.Query);
var result = query["key2"];
Console.WriteLine(result);

Итак, вы сначала декодируете HTML-версию ссылки, анализируете ее как Uri, получаете из нее строку запроса и вводите свою коллекцию ключей / значений.

person Phill    schedule 04.01.2011
comment
если я уберу URL-адрес, я не смогу получить доступ ко второму параметру, по крайней мере, не через класс asp.net HttpRequest, мне пришлось бы вручную закодировать некоторую логику синтаксического анализа для этого. второй параметр внезапно получил название amp; lang вместо просто lang, который я ожидал - person AndreasKnudsen; 04.01.2011
comment
Не уверен, почему вы проголосовали против него, но если вы не можете получить к нему доступ, значит, вы делаете это неправильно. - person Phill; 04.01.2011
comment
Вот, погуглил для вас и выбрал первую ссылку, связанную с амперсандами и URL-адресами. htmlhelp.com/tools/validator/problems.html#amp - person Phill; 04.01.2011
comment
Я ничего не делаю, я использую стандартный фреймворк asp.net. если фреймворк кодирует URL-адреса на выходе, а затем не может их прочитать по пути, это может показаться ошибкой в ​​фреймворке. URL-адреса кодируются только внутри head и только когда head runat = server Остается вопрос: как справиться с этим внутри asp.net - person AndreasKnudsen; 04.01.2011
comment
Он закодирован, потому что это правильный способ форматирования URL-адреса в HTML. Когда браузер выдает запрос для этого ресурса, он не отправляет запрос с & amp;, он выдает запрос для &. Итак, что бы вы ни делали, выходя за рамки нормы о том, как URL-адреса между браузером и сервером, неправильно. - person Phill; 04.01.2011
comment
Я хотел бы знать, почему люди голосуют против моего ответа, несмотря на то, что я прав. - person Phill; 11.06.2015