1

これは、OutputCache の VaryByParam 属性について説明するために作成したサンプル デモです。

マークアップ:

<%@ OutputCache Duration="10" VaryByParam="ID" %>

<asp:Button ID="SetQueryStringButton1" runat="server" 
                Text="Set query string ID=1 and redirect"
                PostBackUrl="~/OutputCachingUsingQueryString/Default.aspx?ID=1" />
    <br />
    <asp:Button ID="SetQueryStringButton2" runat="server" 
                Text="Set query string ID=2 and redirect"
                PostBackUrl="~/OutputCachingUsingQueryString/Default.aspx?ID=2" />
    <br />
    <asp:Button ID="SetQueryStringButton3" runat="server" 
                Text="Set different query string and redirect"
                PostBackUrl="~/OutputCachingUsingQueryString/Default.aspx?ABCD=3" />

コードビハインド:

if (IsPostBack)
    {
        string key = Request.QueryString.GetKey(0);
        MessageLabel.Text = "The value of query string " + key + " is : " + Request.QueryString[key] + "<br/>";
        MessageLabel.Text += DateTime.Now.ToLongTimeString();
    }

最初の 2 つのボタンをクリックすると、VaryByParam の定義に従って、ID = 1 と ID = 2 のページがキャッシュされます。しかし、3 番目のボタンをクリックすると、ABCD = 3 のページがキャッシュされます。 VaryByParam で指定していないため、ABCD=3 のページはキャッシュされるべきではありません。3番目のボタンを繰り返しクリックすると、同じdateTimeが表示されます。

EDIT START :私もこの方法で試しました:

マークアップ:

<%@ OutputCache Duration="10" VaryByParam="ID" %>
<asp:Label ID="MessageLabel" runat="server"/><br/>
<a href="Default.aspx?ID=1">Click Me and pass ID=1</a><br/>
<a href="Default.aspx?ID=2">Click Me and pass ID=2</a><br/>
<a href="Default.aspx?ABCD=3">Click Me and pass ABCD=3</a><br/>

コードビハインド:

if (!IsPostBack)
{
   if (Request.QueryString.Keys.Count > 0)
   {
      string key = Request.QueryString.GetKey(0);
      MessageLabel.Text = "The value of query string: " + key + " is: " +  Request.QueryString[key] + "<br/>";
      MessageLabel.Text += DateTime.Now.ToString();
   }
}

3 番目の をクリックすると、数回クリックした後に MessageLabel が表示されます。ここで私が経験しているある種の奇妙な行動。

編集終了

私が何を間違っているのかを明らかにしてください。前もって感謝します。

4

2 に答える 2

0

OutputCacheページにディレクティブを配置しましたDefault.aspxか? 私が見たものから、あなたはディレクティブDefault.aspxを持つページからポストバックしています....OutputCaching

PostBackUrl :

Button コントロールがクリックされたときに現在のページから投稿する Web ページの URL。デフォルト値は空の文字列 ("") で、ページがそれ自体にポストバックされます。

編集:

同じシナリオを試しましたが、同じ結果が得られました。3 番目のボタンを何度クリックしても、ページはまだキャッシュされていました。Firebug を調べたところ、最初のクリック後にこの情報が表示されます。

Response Headersview
Cache-Control   public, max-age=10

その後、連続してクリックすると、最大年齢が減少します。max-age が 0 に達した場合にのみ、サーバーからページが再度要求されます。これは予期される動作です。

問題は、3 番目のボタンが別のパラメーター (ABCD) を渡しており、OutputCacheディレクティブが別のパラメーター (ID) を指定しているため、キャッシュすべきではないときにページがキャッシュされ続けていることです。

<%@ OutputCache Duration="10" VaryByParam="ID" %>

だから、なぜこれが起こっているのか知りたい... 3番目のボタンは別のパラメータ(ABCD)を渡すので、ページをキャッシュすべきではない(MSDNドキュメントの私の理解による)。たぶん、私たちはすべてを誤解しています。

于 2012-05-09T14:46:29.417 に答える