如何在MVC中从主视图内部刷新/重新加载局部视图

时间:2010-12-10 14:39:58

标签: jquery asp.net-mvc

我使用RenderAction在主要(定价视图)视图中显示部分视图(购物车)

<% Html.RenderAction("Cart", "ShoppingCart"); %>

当用户在主视图上将项目添加到购物车时,我必须更新部分视图以显示新添加的项目。以下是我的部分视图的代码:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Trl.ViewModels.Cart>" %>
<% foreach (var _hotel in Model.Hotels)
   { %>
   Hotel Name: <%: _hotel.Name %> <br/>
   Price: <%: _hotel.TotalPrice %>
<% } %>
上面用户控件中使用的“Trl.ViewModels.Cart”对象将包含新添加的项目,因为我使用ASP.NET会话状态来持久化Cart。如何从我的主视图刷新/重新加载这个局部视图,以便它可以显示新添加的项目?

1 个答案:

答案 0 :(得分:16)

好吧,我已经明确了(呃)想要什么。

我假设主要内容区域是通过ajax更新的。如果是这种情况,那么我的方法是通过ajax和控制器操作进行更新,返回包含侧边栏购物车的部分视图。为此,您需要一个包含该购物车的div的命名ID,以便将其作为更新站点进行定位。

不用多说,快速代码演示我的意思:

控制器:

public ActionResult Create(Cart item)
{
    if (ModelState.IsValid)
    {
        // or could be added to session["cart"] etc..
        _repository.Add(item);
        var cartItems = _repository.Find(x => x.cartID = item.cartID);
        return PartialView("CartMini", cartItems);
    }
    return new EmptyResult();
}

主视图(在右栏中 - 这将是您最初定义局部视图的位置):

<div id="miniCart"></div>

在页面的另一部分(半伪代码):

<script type="text/javascript">
     function updateCart() {
         var tdata = $(frm).serialize(); 
         // or your data in the format that will be used ??
         $.ajax({
           type: "POST",
           data: tdata,
           url : '<%= Url.Action("Create", "Cart") %>',
           dataType: "json",
           success: function (result) { success(result); }  
        });
      }); 

    function success(result){
        $("#miniCart").html(result);
    }
</script>

这真的是需要的东西。对不起匆匆这个,已经开始前一段时间和电话去了,现在必须要关闭:)。如果以后不清楚,将进一步增加。