我有一个在MonoRail上运行并使用Castle ActiveRecord / NHibernate的购物车应用程序,还有一个ShoppingCart表和一个ShoppingCartItems表,它们映射到实体。
这是一个场景:用户将东西添加到购物车,比如5个项目,然后去查看购物车。购物车显示全部5项。用户复制选项卡/窗口并获取同一购物车的另一个选项卡(称为选项卡B)。用户从购物车中删除商品,因此现在标签B中有4个商品,但在原始标签A中,仍有5个商品。用户返回选项卡A,并更新购物车中的内容并单击提交更改的“更新”按钮。我的MonoRail操作尝试使用视图中的数据在ShoppingCartItems上执行ARDataBind,其中包括所有5个项目。当它到达用户从选项卡B中删除的项目时,它会抛出该项目的“没有给定标识符的行”。
我无法弄清楚是否有办法让它不绑定该行,返回null,返回新实例等? ARDataBind属性上有一个AutoLoadBehavior参数,但这似乎只影响子实体的加载,而不影响根实体的加载。无论我选择哪个选项,我都会在控制之前进入操作方法(AutoLoadBehavior.Never除外,但这对我没有帮助)。
相反,我有代码调用Request.ObtainParamsNode()来拉取表单节点并手动将它们解析为对象,并忽略那些不再存在的节点。有更好的方法吗?
感谢。
答案 0 :(得分:1)
继承ARDataBinder,覆盖FindByPrimaryKey(Type targetType, object id)
:
protected override object FindByPrimaryKey(Type targetType, object id) {
return FindByPrimaryKey(targetType, id, false);
}
这里的关键是 false 参数,这使得它返回null而不是抛出。
然后继承ARDataBindAttribute,覆盖CreateBinder()方法并使其返回新的绑定器而不是默认的ARDataBinder。
然后应用您的自定义binder属性而不是ARDataBindAttribute。