一个模型绑定器来统治它们全部或一堆它们?

时间:2012-12-08 18:07:48

标签: c# asp.net-mvc

我的理解需要一些帮助!

我想了解我的asp控制器如何最好地使用模型绑定。基本上我想在我的会话中有一个引用到主对象(cart)的东西,我的用户将以他们请求的形式编辑模型(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);
        }

如果我希望用户与editModel2之类的其他内容进行互动,我是否也应将其放入购物车

希望这能解释我的问题!

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我会放弃自定义模型绑定器。 ASP.NET的默认模型绑定器与强类型Html.____For控件的强大功能相结合,功能非常强大,应该充分利用。

我假设Cart本质上是包含在包含一些元数据的类中的列表。我要做的是创建一个包含表单和for控件的强类型视图,以编辑包含您感兴趣的数据的对象。让我们调用此对象类型MyItem。然后,将表单提交给控制器,该控制器将采用类型MyItem的参数。此参数将填充表单中的数据。然后你可以使用Session变量来访问cart对象,并使用类型为MyItem的对象。

总的来说,这需要很少的逻辑,因为大多数逻辑都直接进入MVC框架。在控制器中处理它,可能使用帮助程序类,具体取决于您的体系结构,并且不必担心模型绑定到MVC。


不要使用隐藏字段!你不需要它们。我认为您可能不理解的是,当您在MVC中拥有Session变量时,您实际上就是使用它,就好像它是单个用户的单个会话一样。如果您使用代码Session["MyCart"]来访问会话中的购物车,则运行该代码的用户将自动访问他或她的购物车。这是因为会话unicity由MVC以安全的方式自动管理。作为开发人员,您无需担心用户访问与其对应的服务器端项目。只需将它们放入会话中,MVC就可以处理其余事务,确保用户只能访问属于它们的会话数据。