2012-02-28 10 views
3

可能性の重複をHttpPostを理解しようとすると:
MVC(3) handleUpdateはMVC3に

私は(ゆっくり)MVC 3を使用する方法を学んだし、現時点では私が見てを持っていますasp.netウェブサイトのMvcMusicStoreチュートリアルアプリ。

今、私はHttpPostの仕組みを理解しようとしています。私が集めることができるものから、ユーザーはブラウザーで必要なアクションを実行し、jQueryを使用してデータをサーバーに([HttpPost]属性の対応する関数に)ポストバックします。この場合、a jsonの結果は、これを処理し、それに応じて要素を更新するブラウザに返されます。

これは分かりますが、私が見ている特定のスニペットコードでは、jsから呼び出しが行われていないように見えるときにhandleUpdate()関数がどのようにヒットしているのか理解できません。またはサーバー側のコードです。私がここで紛失しているものはありますか?とにかく、ここでフロントエンドである:

@model MvcMusicStore.ViewModels.ShoppingCartViewModel 
@{ 
    ViewBag.Title = "Shopping Cart"; 
} 
<script src="/Scripts/jquery-1.4.4.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    $(function() { 
     // Document.ready -> link up remove event handler 
     $(".RemoveLink").click(function() { 
      // Get the id from the link 
      var recordToDelete = $(this).attr("data-id"); 

      if (recordToDelete != '') { 

       // Perform the ajax post 
       $.post("/ShoppingCart/RemoveFromCart", { "id": recordToDelete }, 
        function (data) { 
         // Successful requests get here 
         // Update the page elements 
         if (data.ItemCount == 0) { 
          $('#row-' + data.DeleteId).fadeOut('slow'); 
         } else { 
          $('#item-count-' + data.DeleteId).text(data.ItemCount); 
         } 

         $('#cart-total').text(data.CartTotal); 
         $('#update-message').text(data.Message); 
         $('#cart-status').text('Cart (' + data.CartCount + ')'); 
        }); 
      } 
     }); 

    }); 


    function handleUpdate() { 
     // Load and deserialize the returned JSON data 
     var json = context.get_data(); 
     var data = Sys.Serialization.JavaScriptSerializer.deserialize(json); 

     // Update the page elements 
     if (data.ItemCount == 0) { 
      $('#row-' + data.DeleteId).fadeOut('slow'); 
     } else { 
      $('#item-count-' + data.DeleteId).text(data.ItemCount); 
     } 

     $('#cart-total').text(data.CartTotal); 
     $('#update-message').text(data.Message); 
     $('#cart-status').text('Cart (' + data.CartCount + ')'); 
    } 
</script> 
<h3> 
    <em>Review</em> your cart: 
</h3> 
<p class="button"> 
    @Html.ActionLink("Checkout >>", "AddressAndPayment", "Checkout") 
</p> 
<div id="update-message"> 
</div> 
<table> 
    <tr> 
     <th> 
      Album Name 
     </th> 
     <th> 
      Price (each) 
     </th> 
     <th> 
      Quantity 
     </th> 
     <th></th> 
    </tr> 
    @foreach (var item in Model.CartItems) 
    { 
     <tr id="[email protected]"> 
      <td> 
       @Html.ActionLink(item.Album.Title, "Details", "Store", new { id = item.AlbumId }, null) 
      </td> 
      <td> 
       @item.Album.Price 
      </td> 
      <td id="[email protected]"> 
       @item.Count 
      </td> 
      <td> 
       <a href="#" class="RemoveLink" data-id="@item.RecordId">Remove from cart</a> 
      </td> 
     </tr> 
    } 
    <tr> 
     <td> 
      Total 
     </td> 
     <td> 
     </td> 
     <td> 
     </td> 
     <td id="cart-total"> 
      @Model.CartTotal 
     </td> 
    </tr> 
</table> 

、ここでは(関連する)サーバー側のコードです:

// 
     // AJAX: /ShoppingCart/RemoveFromCart/5 

     [HttpPost] 
     public ActionResult RemoveFromCart(int id) 
     { 
      // Remove the item from the cart 
      var cart = ShoppingCart.GetCart(this.HttpContext); 

      // Get the name of the album to display confirmation 
      string albumName = storeDB.Carts 
       .Single(item => item.RecordId == id).Album.Title; 

      // Remove from cart 
      int itemCount = cart.RemoveFromCart(id); 

      // Display the confirmation message 
      var results = new ShoppingCartRemoveViewModel 
      { 
       Message = Server.HtmlEncode(albumName) + 
        " has been removed from your shopping cart.", 
       CartTotal = cart.GetTotal(), 
       CartCount = cart.GetCount(), 
       ItemCount = itemCount, 
       DeleteId = id 
      }; 

      return Json(results); 
     } 

私はhandleUpdate()が返されるJSONに基づいてDOMを操作していることがわかりますしかし、私はそれがどのように呼び出されているのか私の人生のために把握することはできません?いくつかのjQueryの魔法が進行しているのですか、それともどういう仕組みが完全に誤解されていますか?

ありがとうございます!

+1

他の人のようです[同じ質問がありました](http://stackoverflow.com/questions/5243172/mvc3-handleupdate)。まとめると、MVC2から残っているように見えます。私はそのメソッドのスクリプトが実際にヒットしていることを確認します。 –

+0

"handleUpdate"のソースコードを検索しようとしましたか? –

+1

handleUpdate()も呼び出されません。私は上記のコードでは、呼び出されていないと結論づけなければなりません。 – MrBoJangles

答えて

3

これは呼び出されていません。

サーバー側でRemoveFromCartメソッドを呼び出すクライアント側の関連するコードはこれです:

if (recordToDelete != '') { 

    // Perform the ajax post 
    $.post("/ShoppingCart/RemoveFromCart", { "id": recordToDelete }, 
     function (data) { 
      // Handle result. 
    }); 
} 

URLがRemoveFromCartメソッドのURLのルートにマップ/ShoppingCart/RemoveFromCart、であることに注意してください。

jQuery post methodは、コントローラのメソッドの呼び出しに使用されていて、handleUpdateメソッドではなく、クロージャ(function() { ... })が渡されます。