2

我有一个简单的报告页面 - 几个文本框,当输入和提交数据时,我想在同一页面上异步加载 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")

我如何实现这一目标?

4

2 回答 2

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 之一或其中之一,您可以将其包含在您的页面上

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

<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:当显示视图并处理 ready 事件时填充属性,您的网格将转到 URL 并查找数据。如果您想稍后在另一个操作之后执行此操作,或者动态重复它,您可以从datatype: 'local',and nourl:属性开始。

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

//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

于 2013-01-08T17:01:04.530 回答
1

经过一番挣扎后,我就是这样做的。我有一个主要的观点和一个部分的观点。最初,主视图不包含局部视图。提交数据时,会加载部分视图。

我的报告.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();
        }
于 2013-01-08T19:24:00.593 回答