MicrosoftのページからASP.NETのビューステートについて:
ページライフサイクルのインスタンス化段階で、コントロール階層が作成され、宣言型構文で指定されたプロパティが割り当てられます。これらの宣言型プロパティは、コントロール階層が構築されるときにポストバックごとに自動的に再割り当てされるため、これらのプロパティ値をビューステートに格納する必要はありません。
これが意味するのは、aspx
ファイルに次のようなマークアップが含まれている場合です。
<asp:Label ID="Label1" runat="server" Font-Name="Verdana" Text="Hello, World!"></asp:Label>
ViewStateで永続化する必要がない2つのものは次のとおりです。
- フォント名:
Verdana
- テキスト:
Hello, World!
これらの2つのプロパティは毎回設定されるため、 ViewStateで永続化する必要はありません。
ViewStateで永続化する必要のないものの別の例は、aspx
マークアップファイルで宣言されたアイテムです。
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>One</asp:ListItem>
<asp:ListItem>Two</asp:ListItem>
<asp:ListItem>Three</asp:ListItem>
</asp:DropDownList>
DropDownList
アイテム:
One
Two
Three
毎回宣言されるため、 ViewStateで永続化する必要はありません。
それが私がやりたいことです。ViewStateに永続化する必要のないものをViewStateに永続化しないようにしたい。逆に、ViewStateで永続化する必要があるものは、 ViewStateで永続化する必要があります。
再びMSDNから:
インスタンス化段階でコントロール階層が構築されると、LabelのTextプロパティが「Hello、World!」に設定されます。そのFontプロパティでは、NameプロパティがVerdanaに設定されます。これらのプロパティは、インスタンス化の段階でページにアクセスするたびに設定されるため、この情報をビューステートに保持する必要はありません。
例
マークアップで属性を宣言するのではなく、プログラムで宣言されていると想像してください。
Label1.Font.Name = "Verdana";
Label1.Text = "Hello, World!";
また
DropDownList1.Items.Add("One");
DropDownList1.Items.Add("Two");
DropDownList1.Items.Add("Three");
ここで、ASP.netの魔法に、プロパティが常に存在し、 ViewStateに永続化する必要がないことを通知するために、ページの初期化中にこの変更を行います。
protected void Page_Init(object sender, EventArgs e)
{
//Set properties *before* PageLoad; before the viewstate is read
//That way the properties will not have to be added to the viewstate
Label1.Font.Name = "Verdana";
Label1.Text = "Hello, World!";
DropDownList1.Items.Add("One");
DropDownList1.Items.Add("Two");
DropDownList1.Items.Add("Three");
}
それが機能しないことを除いて。ページサイクルのかなり早い段階でコントロールのプロパティを設定している場合でも、毎回プロパティを設定している場合でも、ASP.NETはそれらをViewStateで永続化する必要があると考えています。
明らかに、過去にさかのぼって実行するにはコードが必要です。ASP.NETがまだマークアップを読んでいると思っていたときから。
ViewStateで永続化する必要のないViewStateのもので永続化できないのはどうしてですか?
追記
なぜこれをするのですか?マークアップに入れるだけ
できません。ドロップダウンアイテムがデータベースからのものである場合ではありません
コントロールの
ViewState
プロパティをに設定しますfalse
できません。それがViewStateで永続化する必要があるものをオフにするときではありません