UCommerce не позволяет пользователям добавлять новые товары во время оформления заказа

У меня есть сайт электронной коммерции с UCommerce. Во время оформления заказа пользователь будет перенаправлен на платежный портал для оплаты.

Я хочу запретить пользователям добавлять новые товары в корзину, пока пользователь находится на портале платежей. Мое текущее решение - сохранить корзину в сеансе, прежде чем перенаправить пользователя на платежный портал.

Session["checkoutOrder"] = TransactionLibrary.GetBasket(!TransactionLibrary.HasBasket()).PurchaseOrder;

Как я могу переписать текущую корзину в корзину после оплаты? Это должно вернуть корзину в исходное состояние до оплаты.

Я попробовал это:

[HttpPost]
public ActionResult ExecutePayment()
{
var order = Session["checkoutOrder"] as PurchaseOrder;
order.Save();
...
}

Но я получаю сообщение об ошибке.Save():

Batch update returned unexpected row count from update; actual row count: 0; expected: 1

2 ответа

Решение

Я бы также добавил, что ваша Сессия ["orderInProcess"] является анти-паттерном в uCommerce. Вы можете столкнуться с неприятными исключениями, поскольку вы сохраняете сущности NHibernate посредством запросов, которые могут / приведут к исключениям, устраненным в сеансе. Это также может привести к первоначальному исключению, которое вы испытываете, поскольку фактически игнорируете состояние sessssion NHibernate.

Просто используйте TransactionLibrary.GetBasket(!TransactionLibrary.HasBasket()).PurchaseOrder; каждый раз, когда вы забираете свою корзину. NHibernate позаботится о кэшировании заказа для вас.

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

var basket = TransactionLibrary.GetBasket(!TransactionLibrary.HasBasket()).PurchaseOrder;
basket["CheckoutInProcess"] = "True";

С наилучшими пожеланиями Мортен

Я справился с этим по-другому, поскольку у меня нет возможности вернуть корзину обратно в исходное состояние.

Я решил заблокировать пользователя от добавления товаров в корзину во время оплаты.

Я создал сеанс Session["orderInProcess"]=true, прежде чем перенаправить пользователя на платежный шлюз.

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

[HttpPost]
public ActionResult AddToBasket(string sku, string quantity, string variant = null)
{

     if (Session["orderInProcess"] != null)
     {
         if (bool.Parse(Session["orderInProcess"].ToString()))
         {
             return Json(new
             {
                  Success = false,
                  ErrorMessage = "Order is currently in process."
             });
          }
      }
   .....
}

Надеюсь, это поможет.

Другие вопросы по тегам