【问题标题】:Loading jqGrid from Ajax Post action从 Ajax Post 操作加载 jqGrid
【发布时间】:2013-01-08 15:27:48
【问题描述】:

我有一个简单的报告页面 - 几个文本框,当输入和提交数据时,我想在同一页面上异步加载 jqgrid。 我正在使用 JQGrid 的 MVC 版本。

没有 jqgrid 我可以加载表格数据,我的视图如下所示

@using (Ajax.BeginForm("GetReport", new AjaxOptions {UpdateTargetId = "result", HttpMethod = "Post" }))
{
        <div class="editor-label">Start Date</div>
    <div class="editor-field">@Html.Editor("StartDate", "DateTime")</div>

    <div class="editor-label">End Date</div>
    <div class="editor-field">@Html.Editor("EndDate", "DateTime")</div>

    <input type="submit" value="Submit" />
}


<div id="result"></div>

我想在它的位置显示一个 jqGrid,而不是一个表格。定义如下的 jqGrid。

@Html.Trirand().JQGrid(Model.ReportGrid, "ReportGrid")

我如何做到这一点?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 jqgrid jqgrid-asp.net


    【解决方案1】:

    我将说明我将如何做到这一点,我认为这也对你有用(我构建了许多带有 MVC3 后端的 jqGrid。

    你已经有了 HTML 组件,或者你可以使用类似的东西。

    <div id="ExampleGridContainer" >
        <table id="ExampleGridName"  class="scroll" cellpadding="0" cellspacing="0" ></table>
        <div id="ExampleGridPager" class="scroll" style="text-align:center;"></div>
    </div>
    

    那么对于您的 Javascript,您需要包含对两者的引用(在此示例中,我使用英语作为我的位置)

    <script src="@Url.Content("~/Scripts/trirand/i18n/grid.locale-en.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/trirand/jquery.jqGrid.min.js")" type="text/javascript"></script>
    

    如果它是您的 _Layout.chtml 之一或在您的 _Layout.chtml 中,您可以将其包含在您的页面中

    然后在视图的脚本部分中,您可以构建类似于

    <script type="text/javascript">
        $(document).ready(function () {
    
        //initalize jqGrid
        $('#ExampleGridName').jqGrid({
            datatype: 'json',
            url: '/ControllerName/ActionName',
            colNames: [ 'ColumnOneName', 'ColumnTwoName']
            colModel: [
            { name: 'ColumnOneName', //etc}
            { name: 'ColumnTwoName', //etc}
            ],
            pager: $('#ExampleGridPager'),
            rowNum: 5,
            rowList: [5,10,20],
            sortname: 'ColumnOneName',
            //etc
            //rest of grid settings
        });
    });
    </script>
    

    现在在上面的示例中,datatype: 'json'url: 属性在视图显示并处理就绪事件时填写,您的网格将转到 URL 并查找数据。如果您想稍后在另一个操作之后执行此操作,或者动态重复此操作,您可以从 datatype: 'local', 开始,而不是 url: 属性。

    当需要设置这些属性并重新加载网格时,您可以:

    //set the `datatype:` and `url:` properties and load the grid
    $('#ExampleGridName').jqGrid('setGridParam', { datatype: 'json', url: '/ControllerName/ActionName' }).trigger('reloadGrid', [{ page: 1}]);
    
    //reload the grid if the `datatype:` and `url:` properties are already configured
    $('#ExampleGridName').jqGrid().trigger('reloadGrid', [{ page: 1}]);
    

    在您的控制器上,您将拥有一个能够响应数据请求并以 JSON 格式生成结果的操作。这绝不是一个基本示例,说明如何使用具有动态加载的 MVC3 jqGrid 启动和运行,并且还有许多更高级的过滤、搜索等选项。

    public ActionResult ActionName(string sidx, string sord, int page, int rows, bool _search, string filters)
    {
     //load data from somthing, 
    IQuerable<Object> results = database.getresults //whatever you want to populate a set of data really
    
    int totalRecords = results.Count();
    
    var pagedResults = results.OrderBy(sidx + " " + sord).Skip((page -1) * rows).Take(rows);
    
        var jsonData = new
        {
            total = (totalRecords + rows - 1) / rows,
            page = page,
            records = totalRecords,
            rows = (
                from tempValue in pagedResults.ToList()                    
                select new
                {
                    cell = new string[] {       
                        tempValue.ColumnOneValue,
                        tempValue.ColumnTwoIntValue.ToString(),
                        //Etc
                }).ToArray()
    
        };
        return Json(jsonData, JsonRequestBehavior.AllowGet);
    }//ActionName
    

    这将是一种非常基本的方式来显示 jqGrid,然后在其他操作/事件之后与其动态交互。 enter code here

    【讨论】:

    • 您的示例使用的是 javascript jqgrid。我试图使用 Jqgrid 的 MVC 版本。如上图
    【解决方案2】:

    我在这里做了很多挣扎。我有一个主要的观点和一个部分的观点。最初,主视图不包含局部视图。提交数据时,会加载部分视图。

    MyReport.cshtml

    @{
        ViewBag.Title = "Report";
    }
    <h2>Report</h2>  
    <br />    
    @using (Ajax.BeginForm("GetReportData", new AjaxOptions { UpdateTargetId = "result", HttpMethod = "Post", InsertionMode = InsertionMode.Replace}))
    {
    
         <div class="editor-label">Start Date</div>
        <div class="editor-field">@Html.Editor("StartDate", "DateTime")</div>
    
        <div class="editor-label">End Date</div>
        <div class="editor-field">@Html.Editor("EndDate", "DateTime")</div>
    
        <input type="submit" value="Submit" />
    }
    
    <div id="result">
    
    </div> 
    

    然后我有 Grid-MyReportPartial.cshtml 的部分视图

    @model MyGridModel
    @using Trirand.Web.Mvc    
    <link href="@Url.Content("~/Content/theme/ui.jqgrid.css")" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="@Url.Content("~/Scripts/trirand/i18n/grid.locale-en.js")"></script>
    <script type="text/javascript" src="@Url.Content("~/Scripts/trirand/jquery.jqGrid.min.js")"></script>
    
    <br />
     @Html.Trirand().JQGrid(Model.Grid, "ReportGrid")
    

    我的控制器有以下内容

     public ActionResult MyReport()
            {
                var gridModel = new Models.Grid.EmpHeadcountGridModel();
                var grid = gridModel.MyGrid;
                SetupHeadCountGrid(grid, DateTime.Now.ToShortDateString(), DateTime.Now.ToShortDateString());
                return View(gridModel);
            }
            public ActionResult GetReportData(string startdate ,string enddate)
            {
                var gridModel = new Models.Grid.MyGridModel();
                var grid = gridModel.EmpHeadcountGrid;
                SetupHeadCountGrid(grid,costcenterid,startdate,enddate);
    
                return PartialView("MyReportPartial",gridModel);
    
    
            }
    
    
            private void SetupHeadCountGrid(JQGrid grid,int costcenterid,string startdate,string enddate)
            {
                grid.ID = "ReportGrid";
                grid.DataUrl = Url.Action("GetHeadcountData") + "?startdate=" + startdate + "&enddate=" + enddate;
            }
    
           public JsonResult GetHeadcountData(string startdate, string enddate)
            {
                DateTime startdt = DateTime.Parse(startdate);
                DateTime enddt = DateTime.Parse(enddate + " 23:59:59");
    
                var gridModel = new Models.Grid.MyGridModel();
    
                var query= { soem query using date criteria}
                gridModel.MyGrid.DataSource = query;
                return gridModel.MyGrid.DataBind();
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 2017-03-09
      相关资源
      最近更新 更多