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>
}