Замок MonoRail ARDataBind пытается привязать несуществующий ряд - PullRequest
0 голосов
/ 20 марта 2010

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

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

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

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

спасибо.

1 Ответ

1 голос
/ 21 марта 2010

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

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

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

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

Затем примените свой пользовательский атрибут связывателя вместо ARDataBindAttribute.

...