Замок монорельсовой дороги ARDataBind пытается привязаться к несуществующему ряду

StackOverflow https://stackoverflow.com/questions/2483682

Вопрос

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

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

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

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

Спасибо.

Это было полезно?

Решение

Унаследовать АРДатаБиндер, переопределить FindByPrimaryKey(Type targetType, object id):

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top