I have a shopping cart application running on MonoRail and using Castle ActiveRecord/NHibernate, and there is a ShoppingCart table and a ShoppingCartItems table, which are mapped to entities.
Here's the scenario: a user adds things to the shopping cart, say 5 items, and goes to view the cart. The cart shows all 5 items. the user duplicates the tab/window and gets another tab of the same cart (call it tab B). the user removes an item from the cart, so now there are 4 items in tab B, but in the original tab A, there are still 5 items. the user goes back to tab A, and updates something in the cart and clicks the "update" button which submits the changes. my MonoRail action tries to do an ARDataBind on ShoppingCartItems using the data from the view, which includes all 5 items. when it gets to the item that the user deleted from tab B, it throws a "No row with the given identifier exists" for that item.
I can't figure out if there is a way to have it not bind that row, return null, return new instance, etc.? there is an AutoLoadBehavior parameter on the ARDataBind attribute, but that appears to only affect loading of child entities, and not the root entity. regardless of which option I choose, I get the exception before control even enters the action method (except AutoLoadBehavior.Never, but that doesn't really help me).
instead, I have code that calls Request.ObtainParamsNode() to pull the form nodes and parse them m开发者_如何学JAVAanually into objects, and ignores the ones that no longer exist. is there a better way?
thanks.
Inherit ARDataBinder, override FindByPrimaryKey(Type targetType, object id)
:
protected override object FindByPrimaryKey(Type targetType, object id) {
return FindByPrimaryKey(targetType, id, false);
}
The key here is the false parameter, which makes it return null instead of throwing.
Then inherit ARDataBindAttribute, override the CreateBinder() method and make it return your new binder instead of the default ARDataBinder.
Then apply your custom binder attribute instead of ARDataBindAttribute.
精彩评论