2009-05-15 3 views
1

EDIT 2:まあ、私はコードに行きました。彼らがここで何をしているか注意してください。彼らはviewstateを読み込んで、次に回り込んでTextプロパティをviewstateにあったものに設定すると言っています。ビューステートの追跡がオンになっていても、LoadViewStateが呼び出された後、私は見ている動作になります。コードの意味は次のとおりです:Label ASP.ViewState実装のバグ?

if(s!= Text){Text = s;}それは問題を完全に取り除き、必要な不変のものをそのまま維持します。

/// <internalonly/> 
     /// <devdoc> 
     /// <para>Load previously saved state. 
     ///  Overridden to synchronize Text property with LiteralContent.</para> 
     /// </devdoc> 
     protected override void LoadViewState(object savedState) { 
      if (savedState != null) { 
       base.LoadViewState(savedState); 
       string s = (string)ViewState["Text"]; 
       if (s != null) 
        Text = s; 
      } 
     } 

編集:これはすべてのテストから、これはラベルコントロールにのみ影響するようです。私はまだこれがバグだと思う。

これはASP.NET 3.5 Webサイトです。 (HTML、頭部、胴体、等切り取ら)

<form id="form1" runat="server"> 
     <asp:Label runat="server" ID="label1"> 
      This is a lot of text. 
      This is a lot of text. 
      This is a lot of text. 
      This is a lot of text. 
      This is a lot of text. 
      This is a lot of text. 
      This is a lot of text.    
     </asp:Label> 
     <asp:Button runat="server" ID="button1" Text="Click" OnClick="button1_Click" /> 
     <script> 
      document.write(document.getElementById("__VIEWSTATE").value.length); 
     </script> 
    </form> 

ページが後ろに、次のコードた:

protected void button1_Click(object sender, EventArgs e) { 
     //label1.AccessKey = "a"; 
    } 

はい、その行がある

は、次の.aspxページを検討しますコメントアウトされました。それに来る。したがって、ボタンをクリックすると、そのviewstateが52バイトであることがわかります。ラベルにはたくさんのテキストがありますが、もちろんviewstateの仕組みは、Textプロパティの初期値が決して変更されなかったので、viewstateにたくさんのテキストを保存する必要はありません。 OK。ここまでは順調ですね。これはすべて予想される動作です。実際、ラベルに1メガのテキストが含まれていても、ビューステートのサイズは52バイトになります。 OK。今度はメソッドを

protected void button1_Click(object sender, EventArgs e) { 
     label1.AccessKey = "a"; 
    } 

に変更してください。変更するプロパティは関係ありません。今すぐボタンをクリックします。 ViewStateのサイズは最大92バイトになります。一文字のアクセスキーを格納するために40バイト、ちょっとあなたが私に尋ねるなら、少しでも:)今度はもう一度ボタンをクリックしてください。 viewstateのサイズは今何ですか? 92バイトは正しくなければなりませんか?いいえ、それはです。もう一度クリックすると、480バイトのサイズにとどまります。何が起こっていますか?ラベルプロパティを変更すると、ラベルがTEXTというラベルをビューステートに格納し始めました。何????ラベルに100Kのテキストを貼り付けると、viewstateが〜100Kまで上がることがわかります。

これはバグですか?これはどのようにの予想どおりの動作ですか?

+0

それがうまくいく方法であれば、それは不思議ではありません。 –

+0

私にバグのように聞こえる。 – Greg

+0

バグかどうかわかりませんが、ViewStateに存在していた場合にのみTextを設定していることに注意してください。 Textプロパティsetterの実装をチェックし、それがしようとしている可能性のある副作用がないかどうかを確認します。 –

答えて

0

はい。これはLabelコントロールのバグです。

3

1文字だけを格納するのではなく、それにも適用されるプロパティを格納する必要があります。

viewstateの動作の詳細については、http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/truly-understanding-viewstate.aspxを参照してください。

viewstateが期待どおりに動作しない可能性がありますが、ビューステートがASP.NETの動作の中心であるため、バグは発生しません。

+0

私はそれが単なる1文字を格納するだけではないことを理解します。私のsnarkyコメントは主な問題ではありませんでした。 記事は言う:はい、あなたは参照記事が、これはバグであると信じて私をリードまさにある 「?ViewStateが何をするのViewState値の初期状態へ 2.トラックの変更」 しかし、ここでは、他のプロパティの初期状態を変更するときに、値の初期状態がSAVEDされているということです。 – aquinas

+0

おそらく、コントロールのデフォルト値ではないすべてのプロパティの初期状態が保存されています。この場合、テキストプロパティのデフォルト値は空の文字列なので、テキストは保存されます。 – uzbones

+0

@uzbones - 記事によると、テキストプロパティの状態はデザイナに設定されているはずです。 – Greg

1

ここにASP.NET開発者:)と述べたviewstate記事の著者。

MSとは言え、MSとは言わないが、明らかにする。はい、これはバグです。なぜなら、値が既にViewStateに格納されているからです(なぜ、それを設定すればViewStateに再び戻すのでしょうか?)。 Textのセッターを見ると、ViewStateに値を設定するだけでなく、Controls.Clear()が呼び出されます。これは、Labelが子コントロールを「テキスト」としてリテラル文字列としてサポートするためです。 LoadViewStateでTextプロパティを設定しなかった場合、テキストの代わりにコントロールがレンダリングされる可能性があります。

あなたが言いました提案された修正がすべてのシナリオでうまくいくかどうかはわかりません。

関連する問題