0

(webdevサーバーから実行されているバニラasp.netサイトでこれをテストしましたが、ここでも問題です):

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

(head タグに runat="server" がない場合)、結果の 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 に「&」を含めることができるようにしたいのですが、ケーキを食べて食べるために使用できるトリックがあります。それも?

あなたのアンドレアス

4

2 に答える 2

3

この問題は以前に発生しましたが、その理由がわかりませんでした。結局、頭の中にリテラルを入れて、背後のコードから 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' />";
}
于 2011-01-04T11:06:32.780 に答える
1

注: 反対票を投じる場合は、別の方法で証明しない限り、私が言ったことは何も間違っていないため、その理由を説明してください。

エスケープされていないアンパサンドを URL に入れると、ブラウザーはエンコードされたものがあると想定するため、URL のアンパサンドをエスケープすることを意図しています。それをエスケープすることで、ブラウザにそれが何であるか、アンパサンドを正確に伝えます。

リンクを壊すことはなく、有効です。

また、新しいクエリ文字列パラメーターを定義していない URL に実際のアンパサンドを渡したい場合は、アンパサンドを '%26' に URL エンコードします。

編集:おそらくこれを本当に奇妙な方法で使用しているので。理由は次のとおりです。ASP.Net が HTML ドキュメントのアンパサンドを HTML エンコードするのは正しいことです。

ブラウザーが URL の要求を発行するとき、HTML でエンコードされた URL の要求を送信するのではなく、HTML でエンコードされていない URL の要求を送信します。

何らかの理由でサーバー側などの値にアクセスしている場合は、次のようなことができます。

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 として解析し、そこからクエリ文字列を取得して、キー/値のコレクションにキーを設定します。

于 2011-01-04T10:32:32.163 に答える