2012-02-20 28 views
9

que tiene un método:URL actual en asp.net mvc

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() }); 
    } 

Usted ve la línea que está comentado: yo quiero que no se aplique cualquier redirección pero sólo estancia en la misma página de donde esta solicitud fue hecha.

Si pongo return View() no está bien porque va a la búsqueda de Vista con este nombre, mientras que este método es una acción simple de añadir a la cesta ..

¿Me podría dar una solución de cómo redirigir a la corriente url o para permanecer en la misma página?

Respuesta

5

Suponiendo que quiere decir volver a donde estaba antes de la visita que el controlador:

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

Tenga en cuenta que si se ha publicado en llegar a esa página [anterior], que va a estar en una pérdida, ya no estás imitando la misma solicitud.

16

Se puede pasar un parámetro adicional cadena returnUrl consulta a este método que indica la url para volver a una vez que el producto ha sido añadido a la cesta:

public ActionResult AddProductToCart(int productId, string returnUrl) 

para que pueda redirigir de nuevo a donde quiera que fueras :

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

y cuando se genera el enlace a esta acción:

@Html.ActionLink(
    "Add product 254 to the cart", 
    "AddProductToCart", 
    new { productId = 254, returnUrl = Request.RawUrl } 
) 

o si hay demasiados temas que esta acción (que por cierto, probablemente debería ser debido a que está modificando el estado en el servidor - se añade un producto a un carrito o algo así):

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

Otra posibilidad es la de usa AJAX para invocar este método. De esta forma, el usuario permanecerá en la página donde quiera que esté antes de llamarlo.

+0

Por "fácil" como es agarrar la referencia, creo que esta es una mejor solución. Es más trabajo por adelantado, pero creo que te da un resultado más sólido. En el lado del deslizamiento, puedes _try_ usando 'returnUrl' y de forma predeterminada a' Request.Referrer'. Un enfoque casi a prueba de balas es crear un HtmlExtender (tal vez 'Html.ActionLinkWithReturnUrl (...)'?) –

+0

@BradChristie, personalmente no uso 'Referrer'. No sé por qué. Simplemente no me gusta. –

+0

Todo lo que dependa de cosas en un entorno sin estado también me da los nervios; así que estoy contigo. –

Cuestiones relacionadas