2011-06-21 9 views
0

MVC3でEntity Frameworkを使用してウィザードを作成しようとしています。オブジェクトの状態(この場合は記事)を2つのステップで保持する必要があります。
私はコントローラに、新しい記事をインスタンス化する静的変数を持っています。さまざまなアクションでは、私はTryUpdateModelを使ってフォームを静的変数にマップします。問題は、TryUpdateModel()もデータベースを更新するようです。自動マッピングを行うためにTryUpdateModelが必要で、静的_article変数を更新する必要がありますが、最後のステップまでデータベースに永続させたくありません。asp.NETのウィザードMVC3で静的オブジェクトを使用する

N.B:MVCでウィザードを作成する方法はたくさんありますが、このようにするには何をすべきかを知りたいので、MVCウィザードのパターンの選択肢はありません。

ありがとうございました。

namespace website.Controllers 
{ 
    public class ArticlesController : BaseController 
    { 
     // private static variable to hold the chosen article in the wizard 
     private static articles _article = new articles(); 

    /// <summary> 
    /// Index page shows a list of articles in a webgrid 
    /// </summary> 
    /// <returns></returns> 
    public ActionResult Index() 
    { 
     List<articles> _articles = Data.getArticles(); 
     return View(_articles); 
    } 

    /// <summary> 
    /// First page of the article wizard 
    /// </summary> 
    /// <returns></returns> 
    public ActionResult BasicDetails(string id, string nextButton) 
    { 

     // back or next doesn't matter - store form values 
     if (_article != null) TryUpdateModel(_article); 

     if (nextButton != null) 
     { 
      return RedirectToAction("ArticleGroup"); 
     } 
     else 
     { 
      _article = Data.GetArticleById(id); 
      return View(_article); 
     } 
    } 

    /// <summary> 
    /// Second page of the article wizard 
    /// </summary> 
    /// <returns></returns> 
    public ActionResult ArticleGroup(string nextButton, string backButton) 
    { 
     TryUpdateModel(_article); 

     if (backButton != null) 
      return RedirectToAction("BasicDetails"); 
     else if (nextButton != null) 
     { 
      return RedirectToAction("Price"); 
     } 
     else 
     { 
      return View(_article); 
     } 
    } 

    /// <summary> 
    /// Third page of the article wizard 
    /// </summary> 
    /// <returns></returns> 
    public ActionResult Price(string nextButton, string backButton) 
    { 

     TryUpdateModel(_article); 

     if (backButton != null) 
     { 
      return RedirectToAction("ArticleGroup"); 
     } 
     else if (nextButton != null) 
      return RedirectToAction("LinkedClubs"); 
     else 
     { 
      return View(_article); 
     } 
    } 

    /// <summary> 
    /// Last page of the article wizard 
    /// </summary> 
    /// <returns></returns> 
    public ActionResult LinkedClubs(string backButton) 
    { 

     if (backButton != null) 
      return RedirectToAction("Price"); 
     else 
      return View(_article); 
    } 


} 
} 
+3

'TryUpdateModel'はデータベースを更新しません。これはMVC固有のメソッドです。あなたがデータベースを使っていることさえ知らない。それは、提供されたモデルを要求パラメータからバインドし、検証ロジックを適用することです。現在のデザインが間違っていても、代替案は必要ありません。ビューモデルを使用する代わりに、ビューでドメインモデルを直接使用します。申し訳ありませんが、私はそのようなデザインであなたに先んじる非常に凹凸のある道路が恐れています。また、ASP.NETアプリケーションでユーザー固有の状態を保持する静的オブジェクト! WTF? 2人のユーザーが同時にウィザードを完了するとどうなりますか? –

+2

私はあなたを正しく理解していれば、データを保持するために静的を使用しています。これは私がどこから始めるべきかわからないウェブアプリケーションではひどく間違っています。複数のユーザーがいる場合(そして複数のユーザーを持つようにWebサイトである場合)、すべてのユーザーはその静的なデータを共有することになります。彼らはお互いの変更を見て、それぞれの変更を上書きし、それぞれの変更を壊します。それは巨大な混乱であろう。 –

+0

ありがとう。 MVCを使い始めたばかりですが、コントローラの静的なプライベート変数はセッション単位のコンテナであることを理解していました。 もちろん、パターンが壊れている場合は、それが図面に戻ってきます。とにかく、もう一度、頭をアップしていただきありがとうございます。 –

答えて

1

通常、データエンティティ(データベースにマップされたエンティティ)とビューモデルエンティティ(そのユーザーが存在するエンティティ)は別々に使用されます。ユーザーが何らかのステップの後にデータを投稿したときには、セッションオブジェクトにTryUpdateModel()を作成します(ユーザーに固有のものであり、すべてのアプリケーションでは静的変数ではありません)。 最後に、ビジネスロジックメソッドUpdateModel(viewmodel)を呼び出し、すべての列をviewmodelのIDで更新し、すべての塗りつぶしプロパティを使用します。

+0

ウィザードのすべてのステップで、別のビューモデルを使用する必要があります。最後のステップで、エンティティを取得し、更新してデータベースに保存します。 –

+0

はい、そうです。そして、ユーザ固有のデータのコンテナとしてコントローラ内の静的変数を決して使用しないでください:) –

2

よりもむしろあなたの状態情報を保持するために静的変数を使用して(つまり、ところで重大なエラーである)あなたがページ間で必要な情報を保持している状態の袋を渡す必要があります。

関連する問題