Possible Duplicate:
MVC(3) handleUpdate




我(正在缓慢地)学习如何使用MVC 3,此刻,我正在看asp.net网站上的MvcMusicStore教程应用程序。

现在,我试图了解HttpPost的工作原理。据我所知,用户在浏览器中执行他们想要的任何操作,然后使用jQuery,将数据发布回服务器(具有[HttpPost]属性的相应功能),然后在这种情况下, 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魔术,或者我完全误解了这一切的原理?

谢谢!

最佳答案

没有被调用。

客户端上在服务器端调用RemoveFromCart方法的相关代码是这样的:

if (recordToDelete != '') {

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


请注意,URL是/ShoppingCart/RemoveFromCart,它映射到RemoveFromCart方法的URL路由。

使用jQuery post method来调用控制器上的方法,然后传递闭包(由function() { ... }表示),而不是传递handleUpdate方法。

10-04 22:49