【问题标题】:Do we Need to refresh the page to display the proper information after AJAX call?我们是否需要在 AJAX 调用后刷新页面以显示正确的信息?
【发布时间】:2014-03-10 18:36:01
【问题描述】:

单击“从购物车中删除”后,javascript 正在从数据库中的购物车表中删除产品,但似乎无法正确刷新屏幕上的视图。我在某处读到,当我们使用 AJAX 时,我们需要在页面返回后控制页面刷新。是这样吗? 我缺少哪些代码可以在此处正确刷新页面?

感谢您分享您的意见。

点击从购物车中删除后我的输出如下所示:

 Details of Cart:

 Checkout >>
 -----------

 TV HD Toshiba has been removed from your shopping cart.

 Product         Price(unit) Quantity
 TV HD Toshiba   944.99       1        Remove from Cart   <== this line should be remove ?
 --------------                        ----------------   <== this line should be remove ?       
 Total                                 0                  <== this line should be remove

这是我想要的,它应该返回

 Details of Cart:

 Checkout >>
 -----------

 TV HD Toshiba has been removed from your shopping cart.

 Product         Price(unit) Quantity

 Total                                 0                 

索引.cshtml

 @model Tp1WebStore3.ViewModels.ShoppingCartViewModel

 @{
   ViewBag.Title = "Shopping Cart";
 }
 <script src="/Scripts/jquery-1.8.2.min.js" type="text/javascript"></script>

 <script type="text/javascript">
     $(function () {
         $('.RemoveLink').click(function () {
             $.ajax({
                 url: '/Panier/RemoveFromCart',
                 data: { id: $(this).data('id') },
                 type: 'POST',
                 cache: false,
                 success: function (result) {
                    $('#row-' + result.DeleteId).fadeOut('slow');
                    $('#cart-status').text('Cart (' + result.CartCount + ')');
                    $('#update-message').text(result.Message);
                    $('#cart-total').text(result.CartTotal);
                 },
                 error: function(XMLHttpRequest, textStatus, errorThrown) { 
                 alert("Status: " + textStatus); alert("Error: " + errorThrown); 
             });
             return false;
         });
     });
 </script>
 <h3>
    <em>Details</em> du panier:
 </h3>
 <p class="button">
     @Html.ActionLink("Checkout >>", "AddressAndPayment", "Checkout")
 </p>  
 <div id="update-message">
 </div>
 <table>
    <tr>
        <th>
            Produit
        </th>
        <th>
            Prix (unitaire)
        </th>
        <th>
            Quantite
        </th>
        <th></th>
    </tr>
    @foreach (var item in Model.CartItems)
    {
       <tr id="row-@item.ProduitId">
           <td>
              @Html.ActionLink(item.Produit.Description,"Details", "Produit", new { id = 
                      item.ProduitId }, null)
           </td>
           <td>
               @item.Produit.Prix
           </td>
           <td id="item-count-@item.PanierId">
               @item.Quantite
           </td>
           <td>
             <a href="#" class="RemoveLink" data-id="@item.PanierId"> Enlever du panier </a>    
           </td>
       </tr>
    }
    <tr>
      <td>
          Total
      </td>
      <td></td>
      <td></td>
      <td id="cart-total">
          @Model.CartTotal
      </td>
    </tr>
 </table>

这是 Google PF12 Network RemoveFromCart。这意味着我认为 Javascript 运行成功。 预览

 {Message:TV HD Toshiba glove has been removed from your shopping cart., CartTotal:0, 
     CartCount:0,..}
 CartCount: 0
 CartTotal: 0
 DeleteId: 31
 ItemCount: 0
 Message: "TV HD Toshiba has been removed from your shopping cart."

回应

  {"Message":"TV HD Toshiba has been removed from your shopping 
         cart.","CartTotal":0,"CartCount":0,"ItemCount":0,"DeleteId":31}

【问题讨论】:

  • 你不应该需要刷新整个页面,这会破坏首先使用 AJAX 的全部意义。您应该做的是在您的 AJAX 调用的 success 处理程序中操作 Javascript 中的 DOM,以更改或删除现在过时的任何元素。
  • @MattBurland 感谢您的回答,您能否举个例子让我了解缺少的内容。我查看了 MVC 音乐商店,我的 AJAX 似乎是相同的,我想我错过了从屏幕上删除该行的部分,但我找不到丢失的内容。有什么想法吗?
  • 如果没有您呈现的 HTML,很难看到,但是在您的 &lt;tr id="row-@item.ProduitId"&gt; 中,您需要识别被删除的行(看起来您的响应包括 DeleteId 并希望映射到特定的row 不知何故,大概是 id="row-31") 并简单地将其从您的表中删除,例如 $("#row-31").remove()
  • 我试图在 .fadeout('slow') ==> $('#row-' + result.DeleteId).remove();但它没有改变任何东西。表示该行仍在屏幕上,不刷新。您能告诉我您需要哪些代码来诊断问题吗?

标签: javascript jquery ajax asp.net-mvc c#-4.0


【解决方案1】:

将用于呈现表格的逻辑移动到部分剃刀视图中,然后使用以下 HTML 帮助程序调用它。 @Html.Partial("CartTable")。

更新您的成功 ajax 处理程序以对服务器进行另一个 ajax 调用以检索此部分视图,然后使用结果更新您的 DOM。

     @model Tp1WebStore3.ViewModels.ShoppingCartViewModel

 @{
   ViewBag.Title = "Shopping Cart";
 }
 <script src="/Scripts/jquery-1.8.2.min.js" type="text/javascript"></script>

 <script type="text/javascript">
     $(function () {
         $('.RemoveLink').click(function () {
             $.ajax({
                 url: '/Panier/RemoveFromCart',
                 data: { id: $(this).data('id') },
                 type: 'POST',
                 cache: false,
                 success: function (result) {
                    $('#row-' + result.DeleteId).fadeOut('slow');
                    $('#cart-status').text('Cart (' + result.CartCount + ')');
                    $('#update-message').text(result.Message);
                    $('#cart-total').text(result.CartTotal);
                    $.get("url").done( function(data){ $("#ContentTable).html(data); } );
                 },
                 error: function(XMLHttpRequest, textStatus, errorThrown) { 
                 alert("Status: " + textStatus); alert("Error: " + errorThrown); 
             });
             return false;
         });
     });
 </script>
 <h3>
    <em>Details</em> du panier:
 </h3>
 <p class="button">
     @Html.ActionLink("Checkout >>", "AddressAndPayment", "Checkout")
 </p>  
 <div id="update-message">
 </div>
 <div id="table-content">
  @Html.Partial("TableContent")
</div>

【讨论】:

  • 当我在 ActionResult RemoveFromCart 上的 PanierController 右击添加 View 时,我们应该选择创建一个 stronly 类型的视图吗?当我使用局部视图时,我唯一的行是@model Tp1WebStore3.Models.Panier,你能提供更多的输入吗
  • 我得到一个错误 404 Not Found with the $.get("url").done( function(data){ $("#TableContent").html(data); } );任何的想法 ?根据我的 div-id="table-content">,我的部分视图称为 TableContent.cshtml
  • 我试过这个,没有错误但没有成功刷新页面(即删除的行仍然出现在页面中 $.get("/Panier").done(function (data) { $("#TableContent").html(data); });
  • 创建一个新的控制器动作,比如 TableView。在该操作内部也应该返回类似 Partial(#TableContent) 的内容。更改 js 函数中的“URL”以匹配您的控制器操作。
  • 您的控制器操作是否正在更新模型?
猜你喜欢
  • 2012-01-23
  • 2020-07-04
  • 2013-01-22
  • 2016-08-25
  • 2013-04-27
  • 1970-01-01
  • 2014-03-15
  • 2013-05-19
  • 2023-03-08
相关资源
最近更新 更多