2009-07-23 11 views
27

私はASP.NET MVCを学んでおり、認証、承認、セッション状態のような "ASP.NET"の多くの概念はまだそれに適用されます。ViewStateはASP.NET MVCに関連していますか?

私が理解しているものは何でも、私はViewStateがまだASP.NETアプリケーションに関連しているとは思わない。しかし、それはそこにあります(System.Web.Mvc.ViewPageのプロパティ)!それは互換性の理由のためだけに存在するのですか、それともまだ何らかの目的/用途を持っていますか?

+6

この種の質問は非常に便利です。私は現在、ASP.NET MVCを使用していません。なぜなら、私は現在、ウェブのことをやっているわけではありませんが、それについて知りたいからです。 – NeedHack

+0

に関連するhttp://stackoverflow.com/a/2230635/52277 –

答えて

6

ViewPageはPageを継承するため、その存在があります。しかし、WebControlsが使用しているViewStateでは、Page自体は使用されていませんでした。元のWebControlsをビューに含めることは可能ですが、そうすることでコントロールをビューから分離する点が完全になくなります。

+0

あなたの推論は正しいですが、私は決定的に答えるので、別の答えを受け入れることにしました! – Hemant

+0

あなたは私の投票を得ます:) – Hemant

2

私はその時代遅れだと思います。私がASP.Net MVCアプリケーションでViewStateを見たのは、誰かが誤ってASP.Netコントロールをページに追加したときだけです。

+8

私はあなたのメッセージを受け取りますが、ASP.NET Webフォームは廃止されていないので、ViewStateも廃止されていません。 ASP.NET ** MVC **では使用されていません! – Hemant

+0

aspでビューステートを真似することは可能です。net mvc –

3

ViewStateは関連性はありませんが、いくつかの優れた機能を提供しています。毎回データを再読み込みする必要はなく、各アイテムのキャッシュなどについても心配していませんでした。 ViewStateはセキュリティを提供しています。これにより、ある程度のフォームの改ざんが防止されました。コンボボックスをバインドした場合、ハッシュされたビューステートと比較された値を参照していないため、検証が失敗する可能性があります。この目的のために、ViewStateはかなり良いものでした。問題は、人々がビューステートを必要としなかったものをオフにしないので、ほとんどのページで非常に大きくなっているということです。

これを解決するにはどうすればよいですか? MicrosoftのMVC Futuresプロジェクトには、Html.Serializeメソッドが含まれており、メソッドパラメータとして[Deserialize]属性とともに、これは 'viewstate'(つまり、シリアライゼーション)をきめ細かく制御できます。

ex。

 
[HttpGet] 
     public ActionResult Index() 
     { 
      OrderRepository repository = new OrderRepository(); 
      var shipTypes = repository.GetAllShipTypes(); 
      var orders = repository.GetAllOrders(); 
      ViewBag.ShipTypes = shipTypes; 
      return View(orders.First()); 
     } 

     [HttpPost] 
     public ActionResult Index(Order order, [Deserialize] List<ShipType> shipTypes) 
     { 
      //Note order.ShipTypeId is populated. 
      ViewBag.ShipTypes = shipTypes; 
      return View(); 
     } 

と私はそれをシリアル化し、また、あなたがMVC3Futures projectでビューステートを模倣することができます必要がある場合はコンボ

 
@Html.Serialize("ShipTypes", ViewData["ShipTypes"]) 
     @Html.DropDownList("ShipTypeId", ((List)ViewData["ShipTypes"]).ToSelectList("ShipTypeId", "Description"), new { @class = "combobox11" }) 



+0

FWIW、現在私の好みは、ページに保存するのではなく、このデータをキャッシュすることですが、これはオプションとして提供されます。特に、Webフォームアプリケーションをmvcに移植し、ページの再設計が完全にできない場合があります。 –

0

でそれを使用するビューで:コントローラインチモデル全体を保存することができます。

あなたがしなければならないことは、モデルをシリアライズして表示するだけです。

@Html.Serialize("Transfer", Model, SerializationMode.EncryptedAndSigned) 

コントローラでは、逆シリアル化属性を追加します。

public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer) 
関連する問題