1

私の理解には助けが必要です!

モデルバインディングをaspコントローラーで使用するのに最適な方法を理解したいと思います。基本的に、セッションでマスターオブジェクト(カート)への参照が必要であり、ユーザーは要求された形式でモデル(editingModel1)を編集します。

基本的に私はこのようなクラスを持つことを考えていました:

   public class customModelBinder : IModelBinder {
        private const string sessionKey = "Cart";

        public object BindModel(ControllerContext controllerContext, 
            ModelBindingContext bindingContext) {

            // get the Cart from the session 
            Cart cart = (Cart)controllerContext.HttpContext.Session[sessionKey];
            // create the Cart if there wasn't one in the session data
            if (cart == null) {
                cart = new Cart();
                controllerContext.HttpContext.Session[sessionKey] = cart;
            }
            // return the cart
            return cart;
        }
    }

このように私のコントローラーでそれを使用します

      public ActionResult Edit(int id, Cart cb)
        {
            Company c = _companyProvider.Read(id);
            cb.editingModel1 = c
            return View(c);
        }

ユーザーがeditingModel2のような別のものと対話するようにしたい場合は、それもカートに入れる必要があります

これが私の問題を説明することを願っています!

助けてくれてありがとう

4

1 に答える 1

0

カスタムモデルバインダーを放棄します。Html.____ForASP.NETのデフォルトのモデルバインダーは、強く型付けされたコントロールの機能と組み合わされて非常に強力であり、利用する必要があります。

Cartaは基本的に、メタデータを含むクラスにラップされたリストであると想定しています。私がすることはfor、あなたが興味のあるデータを含むオブジェクトを編集するためのフォームとコントロールを含む強い型のビューを作成することです。このオブジェクトタイプと呼びましょうMyItem。次に、タイプのパラメーターを受け取るコントローラーにフォームを送信しますMyItem。このパラメータには、フォームからのデータが入力されます。次にできることは、Session変数を使用してcartオブジェクトとそれにタイプするオブジェクトにアクセスMyItemすることです。

全体として、これにはほとんどロジックが必要ありません。ほとんどのロジックがMVCフレームワークに組み込まれているためです。アーキテクチャによってはヘルパークラスを使用して、コントローラーでこれを処理し、MVCへのモデルのバインドについての心配を残します。


非表示のフィールドは使用しないでください。あなたはそれらを必要としません。あなたが理解できないかもしれないのはSession、MVCに変数がある場合、それが単一のユーザーの単一のセッションであるかのように本質的にそれを操作しているということだと思います。コードSession["MyCart"]を使用してセッション中にカートにアクセスすると、そのコードを実行するユーザーは自分のカートに自動的にアクセスできるようになります。これは、セッションの単一性がMVCによって安全な方法で自動的に管理されるためです。開発者としてのあなたは、ユーザーがそれらに対応するサーバー側のアイテムにアクセスすることを心配する必要はありません。それらをセッションに入れるだけで、MVCが残りの処理を行い、ユーザーがそれらに属するセッションデータにのみアクセスできるようにします。

于 2012-12-08T18:34:18.737 に答える