Asp.net mvc NHibernate+;ASP.NET MVC:模型绑定器&x27;会议结束
我使用自定义模型绑定器在操作中绑定订单/订单项。此模型绑定器使用ServiceLocator.Current.GetInstance();而ICart又依赖于IOrderRepository(不确定这是否重要) 现在,当我创建第一个订单项目时,一切正常。当我创建第二个时。然后我尝试显示现在包含两个订单项的订单。这是通过使用Asp.net mvc NHibernate+;ASP.NET MVC:模型绑定器&x27;会议结束,asp.net-mvc,nhibernate,s#arp-architecture,Asp.net Mvc,Nhibernate,S#arp Architecture,我使用自定义模型绑定器在操作中绑定订单/订单项。此模型绑定器使用ServiceLocator.Current.GetInstance();而ICart又依赖于IOrderRepository(不确定这是否重要) 现在,当我创建第一个订单项目时,一切正常。当我创建第二个时。然后我尝试显示现在包含两个订单项的订单。这是通过使用 public ActionResult Show(Order order) {} 订单由我的定制活页夹绑定。我跟踪了它的BindModel,发现调用 order =
public ActionResult Show(Order order) {}
订单由我的定制活页夹绑定。我跟踪了它的BindModel,发现调用
order = cart.GetOrder(id);
订单项目正常-即,我添加了“查看”窗口,查看属性、产品,它们都正常
但是,当控制流转到Show(Order Order)操作方法时,订单的第一项包含无效的产品-访问它们会导致以下错误(著名的错误):
NHibernate.LazyInitializationException:初始化[Orders.Core.OrderItem#5440c233-fb7e-4dc9-8aec-9c8c0115808b]-未能延迟初始化角色集合:Orders.Core.OrderItem.Products,未关闭任何会话或会话
我现在可以在查看order.Items[0]产品时在“监视”窗口中看到这一点
奇怪的是,第二批货还可以!所以如果是这样的话
- HTTP请求。。。My Model Binder-使用orderRepository.get(id)获取订单-会话对两个订单项都可以李>
- mvc发挥了它的魔力
- 动作方法显示(订单)
NHibernate.LazyInitializationException:初始化[Orders.Core.OrderItem#5440c233-fb7e-4dc9-8aec-9c8c0115808b]-未能延迟初始化角色集合:Orders.Core.OrderItem.Products,未关闭任何会话或会话
表示您在请求产品之前已关闭会话。您确定没有任何内容关闭您的会话吗?也许你可以发布一些代码?哦,天哪,我在BaseController上放了[PassParametersDuringRedirect]。我真的做到了,在我试验MvcContrib的时候,我只是忘记了它。它回来了,咬得我好厉害,我花了几个小时来解决这个问题
所以,问题是我很愚蠢,从中吸取的教训是,我们永远不应该做系统范围的属性/行为,因为从副作用的角度来看,这并不比全局变量好。我发布了一些代码。不过,这很简单。没什么特别的。正如我指出的,S#arp只在请求结束时关闭会话,我自己不会这样做。它不应该被关闭。更奇怪的是,如果它是关闭的,为什么最后一个项目仍然是正常的?public class Cart : ICart { public Cart(IOrderRepository orderRepository, ICurrentUser currentUser, IUserSessionStorage storage) {} public Order GetOrder(Guid id) { return orderRepository.Get(id); } } public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var cart = ServiceLocator.Current.GetInstance<ICart>(); //Guid guidId = new Guid(id_value_from_context); var order = cart.GetOrder(guidId); // here order is OK completely return order; }
cart.Save(item); return RedirectToAction<OrdersController>(c => c.Show(item.Order));
return RedirectToAction("Show", "Orders", new { order = item.Order });
[PassParametersDuringRedirect] public class OrdersController