ASP.NetWebフォームを使用しました。私は現在MVCを学習していますが、ASP.NETMVCで生成されたページにはビューステートデータが含まれていないことを読みました。誰かがMVCのビューステートの代わりになるものを説明できますか?なぜ彼らはビューステートを排除したのですか?コントロールにもビューステートがあるので、その場合の代替手段は何ですか?
1 に答える
Webフォームでは、最初のページの読み込みはIsPostbackプロパティを使用して区別され、サーバーコントロールは基本的にPage_Loadイベントのデータまたは初期値で初期化されます。これらの初期設定は、ページの後続のポストバックイベントで保持されます。すでにご存知かもしれませんが、これはすべてviewstateによって実現されます。これは基本的に、ページ上のすべてのサーバーコントロールの状態を含み、ポストバックイベントごとにポストバックされる非表示の変数です。
MVCにはこのメカニズムがなく、完全にステートレスです。つまり、リクエストごとにコントロールの値を手動で割り当てる必要があります。例:
Webフォームの場合
ASPXページ:
<asp:TextBox id="txtName" runat="server"/>
<asp:Button id="btnSubmit" Text="submit" onclick = "btnSubmit_click" />
背後にあるコード
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostback)
{
txtName.Text = "test1";
}
}
protected void btnSubmit_click(object sender, EventArgs e)
{
//some code
}
値を入力して送信ボタンをクリックすると、ビューステートが原因でポストバック後に値が永続化されます。
MVCで
意見
@using(Html.BeginForm()){
<input id="Name" type="text" name="Name"/>
<input type="submit" value="submit" />
}
コントローラ
[HttpPost]
public ActionResult Index(FormCollection values)
{
return View();
}
値を入力して送信ボタンをクリックします。このような永続化メカニズムがないため、値はポストバック全体で永続化されません。手動で達成する必要があります
意見
@using(Html.BeginForm()){
<input id="Name" type="text" name="Name" value="@ViewBag.Name"/>
<input type="submit" value="submit" />
}
コントローラ
[HttpPost]
public ActionResult Index(FormCollection values)
{
ViewBag.Name = values["name"];
return View();
}
注:ViewBagは例を示すためにのみ使用しました。理想的には、コントローラーからviewmodelを渡す必要があります。
追加の入力
状態を永続化するという役割とは別に、ViewStateを使用して値を格納することもできます。たとえば、ViewState ["test"]=objectoranyothervalueのようになります。MVCには、ViewBag、ViewData、TempDataなどの状態管理の他の手法がありますが、違いは、ViewStateのようにサーバーにポストバックされないことです。これらは、コントローラーからビューにデータを渡すために使用されます。