Почему 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>

(no 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. Как это происходит, мне действительно нужно, чтобы тег head был runat = "server", и я также хотел бы иметь возможность иметь "&" в ссылочных URL-адресах внутри него, есть ли какой-то трюк, который я могу использовать, чтобы получить свой торт и съесть его тоже?

Ваш Андреас

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' />";
}

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

Вы должны избегать амперсандов в 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, получаете из нее строку запроса и задаете ключ для вашей коллекции ключ / значение.

Другие вопросы по тегам