2012-02-20 55 views
9

Tôi có một phương pháp:Return to url hiện tại trong 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() }); 
    } 

Bạn thấy dòng đó là nhận xét ra: Tôi muốn có không kích hoạt bất kỳ chuyển hướng nhưng chỉ nghỉ trên cùng một trang từ nơi yêu cầu này được thực hiện.

Nếu tôi đặt return View() nó không phải là tốt vì nó sẽ tìm kiếm View với tên này trong khi phương pháp này là một hành động đơn giản để thêm vào giỏ hàng ..

bạn có thể vui lòng cho tôi một giải pháp làm thế nào để Chuyển tới hiện tại url hoặc để ở trên cùng một trang?

Trả lời

5

Giả sử bạn có nghĩa là quay trở lại nơi bạn đã ghé thăm trước đó điều khiển:

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

Hãy ghi nhớ rằng nếu bạn đăng để có được điều đó [trước] Trang, bạn sẽ có mặt tại một sự mất mát từ bạn không bắt chước cùng một yêu cầu.

16

Bạn có thể vượt qua một tham số chuỗi returnUrl truy vấn bổ sung cho phương pháp này chỉ url để có được trở lại khi sản phẩm đã được thêm vào giỏ hàng:

public ActionResult AddProductToCart(int productId, string returnUrl) 

để bạn có thể chuyển hướng trở lại bất cứ nơi nào bạn đã :

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

và khi tạo liên kết để hành động này:

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

hoặc nếu bạn đang gửi bài đến hành động này (mà theo cách bạn có lẽ nên được bởi vì nó được sửa đổi trạng thái trên máy chủ - nó cho biết thêm một sản phẩm vào giỏ hay cái gì):

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

khả năng khác là sử dụng AJAX để gọi phương thức này. Bằng cách này, người dùng sẽ ở lại trên trang bất cứ nơi nào trước khi gọi nó.

+0

Như "dễ dàng" vì nó là để lấy referrer, tôi nghĩ rằng đây là một giải pháp tốt hơn. Nó hoạt động hiệu quả hơn, nhưng tôi tin nó mang đến cho bạn một kết quả vững chắc hơn. Ở bên trượt, bạn có thể _try_ sử dụng 'returnUrl' và mặc định là' Request.Referrer'. Một cách tiếp cận gần như chống đạn hơn là tạo một HtmlExtender (có thể là 'Html.ActionLinkWithReturnUrl (...)'?) –

+0

@BradChristie, cá nhân tôi không sử dụng 'Referrer'. Không biết tại sao. Chỉ cần không thích nó. –

+0

Bất cứ thứ gì mà bạn dựa vào mọi thứ trong môi trường không quốc tịch cũng sẽ mang lại cho tôi các cảnh quan; vì vậy tôi ở bên bạn –

Các vấn đề liên quan