我有一个方法:
public ActionResult AddProductToCart(int productId)
{
var product = _productService.GetProductById(productId);
if (product == null)
return RedirectToAction("Index", "Home");
int productVariantId = 0;
if (_shoppingCartService.DirectAddToCartAllowed(productId, out productVariantId))
{
var productVariant = _productService.GetProductVariantById(productVariantId);
var addToCartWarnings = _shoppingCartService.AddToCart(_workContext.CurrentCustomer,
productVariant, ShoppingCartType.ShoppingCart,
string.Empty, decimal.Zero, 1, true);
if (addToCartWarnings.Count == 0)
//return RedirectToRoute("ShoppingCart");
else
return RedirectToRoute("Product", new { productId = product.Id, SeName = product.GetSeName() });
}
else
return RedirectToRoute("Product", new { productId = product.Id, SeName = product.GetSeName() });
}
您会看到已注释掉的行:我希望其中不会触发任何重定向,只需停留在发出此请求的同一页面上。
如果我放return View()
它不合适,因为它会搜索具有此名称的View,而此方法是添加到购物车的简单操作..
您能否告诉我如何重定向到当前网址或保持同一页面的解决方案?
答案 0 :(得分:16)
您可以向此方法传递额外的returnUrl
查询字符串参数,指示将产品添加到购物车后返回的网址:
public ActionResult AddProductToCart(int productId, string returnUrl)
这样您就可以重定向回到原来的位置:
if (addToCartWarnings.Count == 0)
{
// TODO: the usual checks that returnUrl belongs to your domain
// to avoid hackers spoofing your users with fake domains
if (!Url.IsLocalUrl(returnUrl))
{
// oops, someone tried to pwn your site => take respective actions
}
return Redirect(returnUrl);
}
并在生成此操作的链接时:
@Html.ActionLink(
"Add product 254 to the cart",
"AddProductToCart",
new { productId = 254, returnUrl = Request.RawUrl }
)
或者如果你正在发布这个动作(顺便说一句,你可能是因为它正在修改服务器上的状态 - 它将产品添加到购物车或其他东西):
@using (Html.BeginForm("AddProductToCart", "Products"))
{
@Html.Hidden("returnurl", Request.RawUrl)
@Html.HiddenFor(x => x.ProductId)
<button type="submit">Add product to cart</button>
}
另一种可能性是使用AJAX来调用此方法。通过这种方式,用户无论身在何处都可以停留在页面上。
答案 1 :(得分:6)
假设您的意思是在访问该控制器之前返回您所在的位置:
return Redirect(Request.UrlReferrer.ToString());
请记住,如果你发布到那个[上一页]的页面,你将会因为你没有模仿相同的请求而感到茫然。