我的部分视图是通过我_Layout
文件代码中的剃刀动作调用调用的。
@Html.Action("CartSummary", "ShoppingCart")
我的控制器中的CartSummary
操作如下所示:
[ChildActionOnly]
public ActionResult CartSummary()
{
var cart = ShoppingCart.GetCart(this.HttpContext);
var viewModel = new ShoppingCartViewModel
{
CartItems = cart.GetCartItems(),
CartTotal = cart.GetTotal()
};
return PartialView("CartSummary", viewModel);
}
我想每秒刷新一次局部视图以反映对用户购物车所做的更改。目前,当我添加一个项目时,整个页面刷新,我可以在我的购物车中看到添加的项目,但是当我从购物车中删除项目时,由Ajax调用完成后,更改不会显示。我怎样才能做到这一点?
为Stephen编辑:
我有一个视图(主视图)调用CartIndex
,在此视图中,我显示用户将项目添加到他/她的购物车。如果他/她想要,用户可以删除项目。在CartIndex
视图中通过ajax调用从购物车中删除项目。当用户删除项目时,此CartIndex视图显示该项目已成功删除,直到此处一切正常。我有一个名为CartSummary
的部分视图,它显示购物车的摘要,例如用户购物车中有多少商品等...我遇到的问题是,当用户从CartIndex
中删除商品时同样应该使用CartSummary
,以便它们可以显示相同数量的项目和总计,但在我的情况下,CartIndex
视图是我的主视图显示正确的数据,但部分视图未更新?以下是从购物车中删除商品的ajax调用。
<script type="text/javascript">
$(function () {
// Document.ready -> link up remove event handler
$(".del-goods").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 + ')');
});
}
});
});
</script>
答案 0 :(得分:0)
我认为,如果购物车的内容发生变化,您想要刷新html dom的一部分。
有几种方法可以解决您的问题。
虽然总的来说你总是必须使用javascript来替换内容。没有C#唯一的方法来做到这一点。
另外你可以切换到像knockoutjs或angular这样的javascript mvvm引擎,只需在客户端基于javascript对象呈现html。这将实际节省一些流量和服务器加载时间。
答案 1 :(得分:0)
@Dawar
根据您的上次评论how can i refresh the partial or in other words how can i just update the partial view when an item is removed from the cart via ajax post ?
<强> HTML 强>
<div id="CartDiv"></div>
<强> C#强>
[HttpPost]
public PartialViewResult RemoveItemFromCart(int itemId)
{
// Code to remove item from cart using the itemId
List<Items> items=Get items from cart
return PartialView("_GetItemsInCart",items);// this is your partial view
}
Javascript和Jquery
function RemoveItemFromCart(itemId) {
// Show some loader image here
$.ajax({
type: "post",
url: '/Cart/RemoveItemFromCart?itemId='+itemId,
success: function (data) {
$("#CartDiv").html(data);
// hide the loader image here
},
error: function (error) {
console.log(error)
}
});
}
答案 2 :(得分:-1)
您可以在计时器中调用ajax调用(CallPartiaView())并重新绑定partialview。取一个div并将初始局部视图放入其中。
<div id="divPartialView">
@Html.Action("CartSummary", "ShoppingCart")
</div>
function CallPartiaView(id) {
$.ajax({
type: "POST",
url: '@Url.Action("CartSummary", "ShoppingCart")',
success: function (data) {
$("#divPartialView").html('');
$("#divPartialView").html(data);
},
error: function () {
}
});
}