2012-03-21 9 views
1

MVCのリストからの更新と削除を最も効果的に処理する方法について、私の頭の中にいくつかの問題があるようです。私は私の問題を簡単な例で説明しようとします。MVC3のViewModelsによる更新と削除の処理

public int Quantity { get; set; } 

public int PositionNumber { get; set; } 

public string ArticleNumber { get; set; } 

public string Name { get; set; } 

public string Remark { get; set; } 

は今、私はそれはそれは簡単なViewModelには同じに見えるようにするために使用されるプロパティを持つのViewModelのforeachビューを作成するのが最善だと聞きました:Entity Frameworkのから私は私の物体の位置を持っています。コントローラでは、モデルをViewModelにマッピングすることによって、ビューの位置のリストをビューに返します。 ビューは、ユーザーが変更できるQuantityおよびRemarkのテキストボックスを表示します。彼はポジションを削除することもできます。

[HttpPost] 
    public ActionResult Index(IEnumerable<ShoppingCartPositionModel> shoppingCartPositions) 
    { 
     var positions = _shoppingCartManager.GetActiveShoppingCart().Positions.Values.OrderBy(p => p.PositionNumber).ToList(); 

     if (FormCollection.AllKeys.Any(k => k.Contains("Remove"))) 
     { 
      string key = FormCollection.AllKeys.Where(k => k.Contains("Remove")).First(); 
      int start = key.LastIndexOf('[') + 1; 
      int end = key.LastIndexOf(']'); 
      int difference = end - start; 

      int index; 
      if (int.TryParse(key.Substring(start, difference), out index)) 
      { 
       _shoppingCartManager.DeleteShoppingCartPosition(positions.ElementAt(index)); 
      } 
     } 
     else 
     { 
      if (ModelState.IsValid) 
      { 

       for (int i = 0; i < positions.Count(); i++) 
       { 
        var position = positions.ElementAt(i); 
        var cartPosition = shoppingCartPositions.ElementAt(i); 

        position.PositionNumber = cartPosition.PositionNumber; 
        position.Quantity = cartPosition.Quantity; 
        position.Remark = cartPosition.Remark; 
       } 

       _shoppingCartManager.UpdateShoppingCartPositions(positions); 
      } 
     } 

     var cartPositions = GetShoppingCartPositionsModel(); 
     UpdateModel(cartPositions); 

     return View(cartPositions.ToList()); 
    } 

私の問題は、この作品その間に他のユーザーがオブジェクトを削除したり、他の中間に新しいポジションを追加しているかどうかである:データを掲載今とき は、ユーザーが、私はこのような何かを入力しますか?ビュー上に非表示のフィールドを作成してマップするのが最善でしょうか?また、更新を検出すると、変更された日付が保存され、そのビューの非表示フィールドが表示されます。なぜなら、このような日付の更新をチェックすれば、私はいつも最新の更新日を持つことになり、数秒でサービスが他のユーザーがデータを変更できるアイテムを更新する必要があるとは思わないからです。 私はこれが私の問題を説明し、私がこれを行う方法を見つけるのを手伝ってくれている人に感謝したいと思います。

+0

なぜエンティティを削除するフォームを投稿したいですか?別のアクション(カート/削除/ IDなど)だけでは使えないのですか?次に、この操作で別のユーザーが既にアイテムを削除した場合のケースを処理できます。 – slfan

+0

リンクを意味しますか?問題は、ショッピングカート全体が更新され(数量など)、単一のアイテムが削除されることです。私はフォーム内でフォームを作って、できるだけ別のポストアクションを呼びたくはありません。 – Nischo

+0

ええ、それは私の意図でした。私はあなたがネストされたフォームを行うことができるとは思わない。 JavaScriptが利用できる場合に備えて、AJAX呼び出しを行うのが一番の方法です。しかし、あなたの場合、それは少し複雑になるでしょう。ポストバックしないとユーザーが自分の変更を失うため、リンクは機能しません。それについてはまだ考えている...その間に:あなたの質問を簡素化しようとすると、あなたはもっと注意を得るかもしれません。主な問題はViewModelではなく、ショッピングカートの位置の更新と削除です。 – slfan

答えて

0

最初に感じる問題は、同じフォーム上で異なるアクションがあることです。あなたが削除と更新のための送信ボタンを別のアクションで扱うことができれば助けになるでしょうか?素晴らしい解決策がありますabout this here

もう1つのポイントは、その間に他のユーザーによる変更が検出されたことです。ビュー全体のデータ構造全体の最終更新時刻の隠しフィールドはどうですか?ポストバックでも同じ場合、誰もデータに触れていません。

+0

ありがとう、それは良いsoultionのようだ、私はできるだけ早くそれを試してみる=) – Nischo

関連する問題