Возврат к текущей ссылке в asp.net mvc - PullRequest
10 голосов
/ 21 февраля 2012

У меня есть метод:

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 с этим именем, а этот метод - простое действие для добавления в корзину.

Не могли бы вы дать мне решение о том, как перенаправить на текущий URL или остаться на той же странице?

Ответы [ 2 ]

16 голосов
/ 21 февраля 2012

В этот метод можно передать дополнительный параметр строки запроса 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 }
)

или если вы выполняете POST для этого действия (что, кстати, вероятно, так и должно быть, потому что оно изменяет состояние на сервере - оно добавляет товар в корзину или что-то в этом роде):

@using (Html.BeginForm("AddProductToCart", "Products"))
{
    @Html.Hidden("returnurl", Request.RawUrl)
    @Html.HiddenFor(x => x.ProductId)
    <button type="submit">Add product to cart</button>
}

Другая возможность - использовать AJAX для вызова этого метода. Таким образом, пользователь останется на странице, где бы он ни находился, прежде чем ее вызвать.

6 голосов
/ 21 февраля 2012

Предполагая, что вы имеете в виду вернуться туда, где вы были до посещения этого контроллера:

return Redirect(Request.UrlReferrer.ToString());

Имейте в виду, что если вы разместили POST для перехода на эту [предыдущую] страницу, вы будете в растерянности, поскольку не будете подражать тому же запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...