ASP.NET では Viewstate を使用する必要がありますか?
-
02-07-2019 - |
質問
私はクラシック ASP から ASP.NET に移行していますが、多くの人がすでに知っている「ビューステート」に遭遇しました。私の思い込みかもしれませんが、非常に面倒そうです。私はこれまでに多くの ASP フォームを開発してきましたが、状態の保持に問題があったことはありません。別の方法はありますか、それとも ASP.NET でこのビューステートについて学習する必要がありますか?Visual Studio 2008、コードビハインド言語として VB.NET、SQL Server 2005 で Framework v3.5 を使用しています。
解決
その必要はありません。チェックアウト MVCフレームワーク. 。これは ViewState を排除し、(少なくともこの観点からは) 古い ASP として機能します。
他のヒント
ViewState を理解するためにこの一連の投稿は必読です
私はこれを無効にし、ほとんどの作業を Load ではなく Page_Init で行います (ControlState により値は維持されます)。この設定は私にとってはうまくいきました。
ViewState はオプションですが、便利です。ViewState とは、サーバー側のコントロールで発生するすべての変更です。したがって、ラベルにテキストを割り当てていて、ポストバックごとに再割り当てすることなくそのテキストを保持したい場合は、それを維持する必要があります。ViewState を常にオンのままにするもう 1 つの例は、データバインドされたものです。
とはいえ、同じ理由で ViewState をオフにした方が役立つ場合もあります。たとえば、私がここで いつも ViewState をオフにするは MESSAGE ラベルです。そうすれば、ユーザーにメッセージ (一度だけ表示されて消えてしまうメッセージ) を印刷する必要があるときに、テキストをラベルに追加するだけで、その後は忘れることができます。次のポストバック中に、ラベルは自動的にそのコントロールの ASPX 宣言にあるテキスト (この場合は空の文字列) に戻ります。
ここで、これはポストバック中に IIS にポストされる値であるフォーム コレクションとは関係がないことに注意してください。フォーム コレクションは、ユーザーがフォーム要素 (テキストボックス、チェックボックス、ドロップリストなど) に入力した値を送信します。これらの .NET は適切な場所に配置され、これが発生します。 後 ViewState が処理されました。
このようにして、「こんにちは」というフレーズを含むテキストボックスをクライアントに送信し、ユーザーがそれを「See ya」に変更してフォームを送信すると、Page_Load イベントが発生するまでにテキストボックスには次の内容が表示されます。 TEXT 属性の「またね」。
従来の ASP では、ジョブを実行するために常に HIDDEN フィールドを使用していました。Viewstate は、それを自動的に行うための単なる手段です。信じてください、学習曲線はあなたが思っているほど高くありません。
ViewState をオフにすると、一部のコントロールが大幅に機能しなくなるため、これらの問題に対処する準備をしてください。怠けてオンのままにするのが最も簡単ですが、チェックを入れずに放置すると、ViewState が HTML のサイズの 30% を簡単に占める可能性があります。
たとえば、DropDown があり、それを Fruits のリストにバインドするとします。if(! でバインドします。IsPostBack) ページ読み込み時の { } ブロック。ViewState をオフにすると、ボタンをクリックしたときに項目が失われます。ページをロードするたびにバインドする必要があります。選択したインデックスも失われるため、Request.Form[] 変数からインデックスを取得する必要があります。
Viewstate は、ASP.NET を使用する場合のパッケージの一部です。基本的なページ/Web サイトの場合、Viewstate の使用方法を「知る」必要はありません。ページにコントロールを配置するときにのみ使用されます。
ASP.NET でビューステートを回避するのは非常に困難です。プロジェクト レベルでビューステートをオフにしても、一部の個々のコントロールは情報を保持するために引き続きビューステートを使用するためです。
Viewstate を処理したくない場合は、ASP.NET MVC フレームワークの使用を検討してください。おそらく、クラシック ASP からの MVC フレームワークの方が使いやすいでしょう。
ViewState は、すべてではないにしても、ほぼすべてのケースで完全にオプションです。ViewStateEnabled=false の場合でも、ASP.NET はフィールドに自動的に再入力します。私は ASP.NET を 5 ~ 6 年間使用していますが、ViewState に依存する必要があったことはありません。可能な場合は無効にすることもあります。
ViewState は、ほとんどの場合、自動的に動作します。これは、ASP.NET がすべてのコントロールの現在の状態を追跡する方法にすぎません。
追加のデータを保存したい場合は、ビューステートを手動で使用することもできます。それは次のように簡単です。
Viewstate["Key"] = value;
唯一の注意点は、ビューステートに格納するオブジェクトはシリアル化可能である必要があることです。
DataGrids と DropDownList で ViewState を使用しないことを強くお勧めします。なぜなら、私自身が最近それを始めたばかりだからです。これは趣味でやったわけではなく、他の問題を引き起こすほど大きくなりすぎたページを修正する必要があったからです。しかし、これは簡単で、結果は非常に劇的だったので、とても満足しています。もちろん、小さくて単純なアプリや少量のデータの場合、これは必要ありませんが、一方で、一貫性を保つことは良いことです (プロセスを継続的に改善できるように、常に既知から既知に移行します...)。余分な荷物を持ち歩くことはありますか?
これには、ユーザー側で少し手動で介入する必要があります。たとえば、ドロップダウン リストのビューステートをオフにした場合は、ポストバックごとにドロップダウン リストを再バインドしてから、Request オブジェクトから SelectedValue を復元する必要があります。これについては詳しく読む必要がありますが、Google にはすぐに入手できる情報がたくさんあります。
ビューステートは、ページに「ルート化」された asp.net コントロールに対して自動的に保持されます。やるべきことはほとんどありません。値とその他の情報は、B64 でエンコードされた非表示の入力で渡されます。必要に応じてそれを見ることができますが、それは問題ではありません。すべて自動的に処理されます。
自分自身で使用するためにコードを作成している場合は、これをオフにするだけで心配する必要はありません。
おそらく、他の人が書いた Web フォーム コードを保守することになるので、構成オプションと問題点が何であるかを知っておく必要があります。私が思いつく上位のいくつか
- サイト、ページ、コントロールレベルで無効にする方法
- MachineKey が Web ファームに関連する理由
- イベント ログが ViewStateAuthentication エラーでいっぱいになる理由
- ViewStateUserKey とは何ですか
実際の学習曲線という点では、これはおそらく MSDN の記事をいくつか徹底的に読むことと同じです。
ViewState は、Web フォームのメタファーに固有の必要悪です。私は個人的に、この方法論は時代遅れで肥大化しており、一般的に Web フレンドリーではないと感じています。上で提案した MVC フレームワークを確認してください。
データをやり取りするための「キャッシュ」として ViewState を使用する誘惑は避けることをお勧めします (クラスター化されたセットアップと SQL ベースのセッション状態がないため、これを行っている Web サイトを見たことがあります)。データはシリアル化されてページに追加され、リクエストごとにラウンドトリップを実行する必要があるため、ページの合計サイズが増加し、サイトの読み込みが遅くなります。
'<%@ Control Language="C#" AutoEventWireup="true" CodeFile="HomePage.ascx.cs" Inherits="HomePage" %>
<script runat="server">
void testHF_ValueChanged(object sender, EventArgs e)
{
this.HFvalue.Text = this.testHF.Value ;
}
</script>
<asp:Label ID="UserNamelbl" runat="server" Text="User Name : " Visible="false"></asp:Label>
<asp:TextBox ID="UserNametxt" runat="server" Visible="false" ></asp:TextBox>
<asp:Label ID="HFvalue" Text="......" runat="server"></asp:Label>
<asp:HiddenField ID="testHF"
OnValueChanged="testHF_ValueChanged"
value=""
runat="server" ></asp:HiddenField>
<input type="submit" name="SubmitButton" value="Submit" onclick="CL()" />
<script type="text/javascript">
function CL()
{
this.testHF.Value = this.UserNametxt.Text;
}
</script>
'