2010-03-20 2 views
0

У меня есть приложение для корзины покупок, работающее на MonoRail, и использование Castle ActiveRecord/NHibernate, а также таблица ShoppingCart и таблица ShoppingCartItems, которые отображаются на объекты.Замок MonoRail ARDataBind пытается связать с несуществующей строкой

Вот сценарий: пользователь добавляет вещи в корзину покупок, скажет 5 предметов и отправляется на просмотр тележки. Тележка показывает все 5 предметов. пользователь дублирует вкладку/окно и получает другую вкладку одной и той же корзины (назовите ее вкладкой B). пользователь удаляет элемент из корзины, так что теперь на вкладке B есть 4 элемента, но на исходной вкладке A все еще есть 5 элементов. пользователь возвращается на вкладку A и обновляет что-то в корзине и нажимает кнопку «Обновить», которая отправляет изменения. мое действие MonoRail пытается сделать ARDataBind на ShoppingCartItems, используя данные из представления, в которое входят все 5 элементов. когда он добирается до элемента, который пользователь удалил из вкладки B, он выбрасывает «Нет строки с заданным идентификатором» для этого элемента.

Я не могу понять, есть ли способ, чтобы он не связывал эту строку, возвращал null, возвращал новый экземпляр и т. Д.? в атрибуте ARDataBind есть параметр AutoLoadBehavior, но это влияет только на загрузку дочерних объектов, а не на корневой объект. независимо от того, какой вариант я выбираю, я получаю исключение, прежде чем управление даже войдет в метод действия (кроме AutoLoadBehavior.Never, но это на самом деле мне не помогает).

Вместо этого у меня есть код, который вызывает Request.ObtainParamsNode(), чтобы вытащить узлы формы и разобрать их вручную в объекты и игнорировать те, которые больше не существуют. Есть ли способ лучше?

спасибо.

ответ

1

Наследование ARDataBinder, переопределения FindByPrimaryKey(Type targetType, object id):

protected override object FindByPrimaryKey(Type targetType, object id) { 
    return FindByPrimaryKey(targetType, id, false); 
} 

Ключевой момент здесь является ложными параметром, который позволяет возвращать нуль, а не бросать.

Затем наследуйте ARDataBindAttribute, переопределите метод CreateBinder() и заставьте его вернуть новое связующее вместо стандартного ARDataBinder.

Затем примените свой собственный атрибут связующего вместо ARDataBindAttribute.

+0

awesome - спасибо. Я не был уверен, что где-то там где-то было место, но это отлично работает. –