2011-07-20 1 views
2

がここに私のモデルのアクション間のモデル(のasp.net MVC)の性質を保持することができます。はどのように私は

public ActionResult Action1() 
    { 
     MyModel model = new MyModel(); 
     //do something with model.UserTypeField 
     return View(model); 
    } 
:最初のアクションで

public class MyModel 
    { 
     public int BaseTypeField { set; get; } 

     public MyType UserTypeField { set; get; } 
    } 

、私は、通常のビューにmymodelというの合格しました

Action1Viewで私は簡単にmodel.BaseTypeFieldをHtmlHelperで変更できますが、このビューでmodel.UserTypeFieldを変更したくありません(どちらもHiddenForで保存できません)。 その後Action1View別のアクションにモデルを提出する:ここで

public ActionResult Action2(MyModel model) 
    { 
     //model.UserTypeField is lost here 
     return View(); 
    } 

は問題が来る:どのように私はセッションのようなものを除いてmodel.UserTypeFieldを保存/保持することができます??

+0

あなたが隠しフィールドにそれを置くことができない理由? – hatchet

+0

隠しフィールドを失わないようにする唯一の方法は、<%= Html.HiddenFor(o => o.UserTypeField.EveryFieldInUserField.MaybeSomeOthers)%>です。それはあまりにも迷惑なのですか? – rhapsodyn

答えて

0

セッション状態を使用したくない場合は、情報をクライアントに渡して、要求に応じてセッション状態を渡すようにしてください。あなたがこれを行うことができる1つの方法は、クッキーを使用することです。別の方法として、隠しフォームフィールドを使用する方法があります。 Action1へのレスポンスにフィールドを含めると、ブラウザはAction2へのリクエストで自動的にフォームを送信します(フォームPOSTを使用してアクションを呼び出すと仮定します)。

0

あなたは、コントローラのアクション間で状態を維持するために多くのオプションを持っている:

  1. ストアそれビューの隠し入力要素(で、私はあなたができないと言うことを理解し、たくさんのがありますがそれが理由であるかもしれない良い理由)。
  2. セッション状態で格納します。
  3. アプリケーションデータベースに格納します(ただし、セッション状態を使用することもできます)。
  4. クッキーに保存します。 HttpCookieを作成してAction1のHttpContext.Current.Response.Cookiesに追加し、Action2のHttpContext.Current.Request.Cookiesから読み込むことができます。

データ量が少なく、セッション状態を他の場所で使用する必要がない場合は、おそらくCookieオプションを使用します。しかしセッション・ステートには、この種の目的があります。それが正しいことなら、それを使うのを恐れないでください。

+0

私の場合、どのように私はそれを隠しに格納できますか? <%= Html.HiddenFor(o => o.UserTypeField)%>はAction2(model.UserTypeField == null)== trueであることが分かります – rhapsodyn

0

各アクションには、リクエストから受け入れるフィールドのプロパティのみを持つパラメータが必要です。残りのオブジェクトはデータストアから再度ロードする必要があります。言い換えれば、Action2は、消費者が意図せずに多くのプロパティを変更できるようにするため、モデル全体を取り込むプロパティを取らないようにしてください。

これは、すべてのステップで多くの作業を行うように思われるかもしれませんが、変更したくないすべてのフィールドに対してすべての検証を行う必要がないため、多くの頭痛を軽減できます。また、関数内でラップすると、残りのモデルをデータストアからロードすることも簡単です。

0

TempData []は、アクション間でアイテムを保持することを目的としていますが、セッションを使用します。キーがKeepを使用してマークされていない場合は、次のアクションが実行されると削除されます。

Session fullstopを回避するには、オブジェクトをシリアル化し、ビュー(隠しフォーム変数など)でクライアントに送信してから、逆シリアル化してAction2に戻す必要があります。

あなたは(あなたには、いくつかの理由のためにセッションを使用することはできませんしない限り、最も簡単でしょう)TempDataをを使用したい場合は、構文は単に次のようになります。

public ActionResult Action1() 
{ 
    MyModel model = new MyModel(); 
    //do something with model.UserTypeField 

    TempData["UserTypeField"] = model.UserTypeField; 

    return View(model); 
} 

public ActionResult Action2(MyModel model) 
{ 
    model.UserTypeField = TempData["UserTypeField"]; 

    return View(); 
}