在自己的WebGrid中从链接更新部分视图

时间:2014-07-26 00:12:12

标签: asp.net-mvc razor asp.net-mvc-5 webgrid

这是我开发MVC的第三天,我希望这是一个简单的问题。基本上我在局部视图中有一个WebGrid,它有一个通过控制器执行更新的列。

控制器然后成功返回更新的局部视图,但它用结果而不是部分视图替换整个页面。

以下是部分视图:

@model Site.Models.UsersForCompanyModel

@{
    ViewBag.Title = "Admin User Management Grid";
}

    @{
        var grid = new WebGrid(

        Model.Users,
        ajaxUpdateContainerId: "divUserGrid",
        fieldNamePrefix: "gridItems_",
        pageFieldName: "paging",
        sortFieldName: "sortField"
        );

        grid.Pager(WebGridPagerModes.All);

        var userColumns = new List<WebGridColumn>
        {
            new WebGridColumn {ColumnName = "Email", Header = "E-Mail", CanSort = true},
            new WebGridColumn {Header = "Lock", Format = user => user.isAdmin ? Html.Raw("n/a") :  Html.ActionLink(user.IsLocked ? "Unlock" : "Lock", "ToggleLock", new {userId = user.Id, companyId = Model.CompanyId}) },
        };

        <div id="divUserGrid">
            @grid.GetHtml(
             htmlAttributes: new { id = "userGrid" },
             tableStyle: "table table-striped table-bordered",
             columns: userColumns
             )
        </div>
    }

......这是控制器代码:

    public ActionResult GetUsersForCompany(string companyId)
    {
        using (var service = new ManagementService())
        {
            var model = GetUsersForCompany(companyId, service);
            return PartialView("AdminUserManagement_Grid", model);
        }
    }

    public ActionResult ToggleLock(string companyId, string userId)
    {
        using (var service = new ManagementService())
        {
            var user = service.GetUserById(userId);
            service.LockUser(userId, !user.IsLocked);
            return GetUsersForCompany(companyId);
        }
    }

使用ToggleLock()返回的结果更新部分视图最简单的方法是什么?

有没有办法通过Html.ActionLink或Ajax.ActionLink以声明方式进行?

2 个答案:

答案 0 :(得分:1)

最简单的方法是将您的局部视图放在容器div中,如下所示

<div id="PartialViewDivId">
@{ Html.RenderAction("GetUsersForCompany",model.CompanyId);}
</div> 

然后使用jQuery加载更新的视图 在某些点击事件

var companyId= read company id
var userId= read user id 
var url = "mycontroller/ToggleLock?companyId="+companyId+"&userId"+userId;
$("#PartialViewDivId").load(url) 

答案 1 :(得分:0)

谢谢,Kartikeya。虽然我找到了一种不需要手动HTML /事件连接和自定义javascript的声明方式,但答案仍然存在部分功劳。

关键是简单地切换到Ajax.ActionLink(而不是使用Html.ActionLink),然后设置我的局部视图占位符ID(我有一个类似于Kartikeya的示例的div设置)和其他一些参数控件的AjaxOptions,如下所示:

new WebGridColumn {Header = "Lock", 
    Format = user => user.isAdmin ? Html.Raw("n/a") : 
            Ajax.ActionLink( user.IsLocked ? "Unlock" : "Lock",
                 "ToggleLock",
                  new{userId = user.Id, companyId = Model.CompanyId },
                 new AjaxOptions
                 {
                     UpdateTargetId="userGridPlaceholder", // <-- my grid placeholder
                     InsertionMode = InsertionMode.Replace, 
                     HttpMethod = "GET" 
                 })