【问题标题】:MVC 4 Refresh a PartialView OnlyMVC 4 仅刷新 PartialView
【发布时间】:2012-07-14 21:26:44
【问题描述】:

我目前正在开发一个具有 CRUD 功能的网站。在添加、编辑或删除成功完成后,我正在使用下面的 javascript 代码显示一条消息。

function addSuccess(data) {
    if (data.Success == true) {
        $('#addDialog').dialog('close');
        $('#commonMessage').html("Process Complete");
        $('#commonMessage').delay(400).slideDown(400).delay(3000).slideUp(400);
    }
    else {
        $("#add-message").html(data.ErrorMessage);
        $("#add-message").show();
    }
}

但是,我在包含 webGrid 的局部视图上呈现结果。在这种情况下,产品的表格列表位于此部分视图中。在(假设)编辑过程完成后,我希望编辑的字段在编辑对话框关闭后反映。我的问题是,我不知道如何在不影响整个页面的情况下刷新局部视图。

有人可以指点我这样做的好方法吗?非常感谢!


编辑:

下面是我如何将项目添加到我的网格。请注意,整个代码都在我的 PartialView 中。谢谢!

@{
    MyStore.Business.Manager.ProductsManager repository = new MyStore.Business.Manager.ProductsManager ();

    List<MyStore.Data.Products> ProductsList = repository.GetAllProducts(ViewData["StoreCode"].ToString());

    var grid = new WebGrid(ProductsList );

    grid.Pager(WebGridPagerModes.All);
            @grid.GetHtml(tableStyle: "webGrid",
                htmlAttributes: new { id = "DataTable" },
                headerStyle: "header",
                alternatingRowStyle: "alt",
                columns: grid.Columns(
                    grid.Column("ProductCode", style: "width: 400px;"),
                    grid.Column("Name", style: "width: 400px"),
                    grid.Column("Price", style: "width: 100px;"),
                    grid.Column("", format: @<text>@Html.ActionLink("Edit", "_Edit", new { RecordID = item.RecordID }, new { @class = "editLink" })</text>, style: "width: 100px"),
                    grid.Column("", format: @<text>@Html.ActionLink("Delete", "_Delete", new { RecordID = item.RecordID }, new { @class = "editLink" })</text>, style: "width: 100px")
                                                 ));                                                      
    }            

【问题讨论】:

    标签: javascript jquery asp.net-mvc refresh partial-views


    【解决方案1】:

    使用 jquery ajax 重新加载内容

    if (data.Success == true) {
        $('#addDialog').dialog('close');
        $('#commonMessage').html("Process Complete")
                       .delay(400).slideDown(400).delay(3000).slideUp(400);
    
        $("#yourContainerDiv").load("Url.Action("GetProducts ","Items")")
    
    }
    

    假设yourContainerDiv 是您拥有网格标记的Div /table,并且Items 控制器的GetProducts 操作方法返回网格标记。

    如果您在按钮单击事件中执行保存/更新,请确保使用 peventDefault 方法停止默认表单提交行为

    $("#someButtonId").click(function(e){
      e.preventDefault();
      //Save data or whatever ...
    }); 
    

    编辑: 设置更新后的问题。

    为什么要将 UI (view) 与 code 混合使用。保持分开。

    有一个action 来获取数据并将其传递给强类型视图

    public ActionResult GetProducts()
    {
       var repository = new MyStore.Business.Manager.ProductsManager ();
       var productList = repository.GetAllProducts(ViewData["StoreCode"].ToString());
       return View(productList);    
    }
    

    现在有一个视图(GetProducts.cshtml),它被强类型为 Lost of Products 类。

    @model MyStore.Data.Products
    @{
      Layout=null;
    }
    <table>
       @foreach(var item in Model)
       {
         <tr>
          <td>@item.ProductCode</td>
          <td>@item.Name</td>
          <td>@item.Price</td>
         </tr>
       }
    </table>
    

    我个人将我的实体/模型名称保持为单数,例如 Customer /Product

    【讨论】:

    • 嗨!感谢您的回复!您能解释一下GetProductsItems 部分吗?我似乎不明白。谢谢!!!
    • 这是否意味着GetProducts 是来自Items 控制器的方法的名称,该控制器返回要绑定到webGrid 的ListofProducts?因为如果它确实是那样的意思,那么我不得不说我不是那样做的。请参阅我上面的编辑。谢谢! :)
    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多