我有简单的报告页面 - 几个文本框,当输入和提交数据时,我想异步加载同一页面上的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")
我如何实现这一目标?
答案 0 :(得分:1)
我将逐步说明我将如何做到这一点,我认为这也适用于你(我使用MVC3后端构建了许多jqGrids。
您已经拥有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:
属性,您的网格将转到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
答案 1 :(得分:1)
经过多次苦苦挣扎,这就是我所做的。我有一个主视图和一个局部视图。最初,主视图不包含局部视图。提交数据时,将加载部分视图。
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();
}