2010-02-14 122 views
1

我呈現出像這樣的局部視圖:ASP.NET MVC Ajax.BeginForm返回意外的結果

<div id="cart"> 
    <%Html.RenderPartial("Cart", Model); %> 
</div> 

對於在車中的每個行我使用的是形式刪除的項目(這是這一重要當JavaScript被禁用,因此沒有Ajax.ActionLink作品):

<%using (Ajax.BeginForm("RemoveFromCart", "Cart", new AjaxOptions { UpdateTargetId="cart"})) 
    {%>       
     <%=Html.Hidden("ProductId", line.Product.Id)%> 
     <%=Html.Hidden("returnUrl", ViewData["returnUrl"])%> 
     <input type="image" src="<%=AppHelper.ImageUrl("delete.gif")%>" value="Remove item" /> 
<%} %> 

我的控制器操作:

 [HttpPost] 
    public ActionResult RemoveFromCart(Cart cart, int productId, string returnUrl) 
    { 
     Product p = _catalogService.GetProduct(productId); 
     cart.RemoveLine(p); // TODO - what about if null? 

     if (Request.IsAjaxRequest()) 
      return PartialView("Cart", cart); 
     else 
      return RedirectToAction("Index", new { returnUrl }); 
    } 

根據我的理解,啓用javascript後,單擊刪除按鈕將對操作進行異步發佈,並用更新後的局部視圖替換「購物車」容器的內容。如果js被禁用,則會進行完整回發,並且用戶會再次被重定向到索引頁面。

如果我添加一些項目到購物車並刪除一個項目它工作正常。但是,如果我然後嘗試刪除另一個項目,則什麼都不會發生原因是在成功刪除後查看頁面源,包含要刪除的產品ID的隱藏字段顯示已刪除項目的ID。

成功刪除之前:

<input id="ProductId" name="ProductId" type="hidden" value="6" /> 
<input id="ProductId" name="ProductId" type="hidden" value="22" /> 
<input id="ProductId" name="ProductId" type="hidden" value="47" /> 

去除第三產品後(47),其餘項目顯示的值47.我的模型無疑更新的隱藏字段,我可以看到踩着當該項目被刪除通過控制器操作,但它好像我的部分視圖沒有正確綁定。

任何幫助,將不勝感激。

感謝 本

回答

3

把您的產品ID在路由值形式擴展,而不是隱藏字段。我認爲這將完全避免這個問題。

<%using (Ajax.BeginForm("RemoveFromCart", "Cart", new { id = line.Product.Id }, new AjaxOptions { UpdateTargetId="cart"})) 
    {%>       
     <%=Html.Hidden("returnUrl", ViewData["returnUrl"])%> 
     <input type="image" src="<%=AppHelper.ImageUrl("delete.gif")%>" value="Remove item" /> 
<%} %> 
+0

絕對是現貨 - 謝謝。 我還發現用以下代碼替換Html.Hidden幫助方法: 」/> 修復了這個問題。有任何想法嗎? – 2010-02-14 14:31:22

+0

不確定。不過,您知道,HTML元素上的id必須是唯一的,對。來自助手和手寫輸入的HTML都是無效的。我可能會改變它以使用returnUrl的路由值。我不得不在JavaScript調試器中查看它以真正瞭解發生了什麼。 – tvanfosson 2010-02-14 14:38:27

+0

+1' 2011-01-07 08:08:13