Почему URL-адреса кодируются в тегах <link>внутри <head runat = "server"> и как этого избежать (asp.net) - PullRequest
0 голосов
/ 04 января 2011

(Я проверил это на ванильном сайте 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>

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

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

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

Ваш Андреас

Ответы [ 2 ]

3 голосов
/ 04 января 2011

Эта проблема случалась со мной раньше, я не мог выяснить причину этого, я закончил тем, что вставил литерал в голову, и заполнил 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' />";
}
1 голос
/ 04 января 2011

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

...