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."
});
}
}
.....
}
Надеюсь, это поможет.