Asp.net mvc 3 返回到asp.net mvc中的当前url
我有一个方法:Asp.net mvc 3 返回到asp.net mvc中的当前url,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,我有一个方法: public ActionResult AddProductToCart(int productId) { var product = _productService.GetProductById(productId); if (product == null) return RedirectToAction("Index", "Home"); int productVariantId = 0;
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() });
}
您可以看到被注释掉的一行:我不想在那里触发任何重定向,只想停留在发出此请求的同一页面上
如果我放置returnview()
,这不好,因为它将搜索具有此名称的视图,而此方法是添加到购物车的简单操作
您能给我一个如何重定向到当前url或保持在同一页面上的解决方案吗?假设您的意思是返回到访问该控制器之前的位置:
return Redirect(Request.UrlReferrer.ToString());
请记住,如果您发布到[上一页]页面,您将不知所措,因为您没有模仿相同的请求。您可以向此方法传递一个额外的
returnUrl
查询字符串参数,指示产品添加到购物车后要返回的url:
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 }
)
或者,如果您正在发布此操作(顺便说一句,您应该这样做,因为它正在修改服务器上的状态-它将产品添加到购物车或其他东西中):
使用(Html.BeginForm(“AddProductToCart”、“Products”))
{
@隐藏(“returnurl”,Request.RawUrl)
@Html.HiddenFor(x=>x.ProductId)
将产品添加到购物车
}
另一种可能是使用AJAX调用此方法。这样,用户在呼叫之前无论在何处都会停留在页面上。就像抓取推荐人一样“简单”,我认为这是一个更好的解决方案。这是更多的前期工作,但我相信它会给你一个更坚实的结果。另一方面,您可以尝试使用
returnUrl
,并默认为Request.referer
。一种几乎更为防弹的方法是创建一个HtmlExtender(可能是Html.ActionLinkWithReturnUrl(…)
?)@BradChristie,就我个人而言,我不使用referer
。不知道为什么。只是不喜欢。任何你在无状态环境中依赖事物的东西都会让我感到恐惧;所以我支持你。不知道为什么,我只是有点偏执,认为一定有某种IE版本或某些东西在特定情况下不会随请求发送此HTTP头,它会破坏我的网站,而使用查询字符串参数我觉得更安全。去责备我,不是我。它咬了我很多次,我宁愿采取预防措施。我没有严格的科学证据,只是我对IE的偏执。但也许所有这些都不是必要的,推荐人的标题会很好。@BradChristie/Darin:看看为什么依赖它是个坏主意。如果在这种情况下它没有被发送,站点仍然可以运行,但是用户将被重定向到默认路由(我假设)。从可用性的角度来看,这可能会非常混乱,而且肯定是有害的。
@using (Html.BeginForm("AddProductToCart", "Products"))
{
@Html.Hidden("returnurl", Request.RawUrl)
@Html.HiddenFor(x => x.ProductId)
<button type="submit">Add product to cart</button>
}