我使用MVC3开发系统,并且为了渲染Grid,有必要使用WebGrid。 我有一个ActionResult,它返回包含空网格的Index页面。 我有另一个ActionResult接收这些过滤器参数,执行过滤器查询并返回填充的网格。 当我分页这个网格时,网格返回空,因为它调用了Index ActionResult。
答案 0 :(得分:2)
我找到了解决方案。它包含了对Session(或Cache或TempData)的搜索,仅此而已。解决方案很好,因为你可以根据你的真实情况调整它,不需要特定的类JQuery。
神奇的技巧发生在你的Index ActionResult(或你的默认ActionResult,它将使网格页面呈现其默认行为)。
代码示例:
[HttpGet]
public ActionResult Index()//My default action result that will render the grid at its default situation
{
SearchViewModel model = new SearchViewModel();
if (Request.IsAjaxRequest()) //First trick is here, this verification will tell you that someone sorted or paged the grid.
{
if (Session["SearchViewModel"] != null) //If session is not empty, you will get the last filtred values from it.
model = (SearchViewModel)Session["Filtro"];
}
else // If it is not an AjaxRequest, you have to clear your Session, so new requests to Index with default behavior won't display filtred values.
{
Session["SearchViewModel"] = null;
}
model.GridResult = ExecuteFilter(model); // OPITIONAL! This code dependes on how is your real world situation. Just remember that you need to return a default behavior grid if the request was not called by the WebGrid, or return filtred results if WebGrid requested.
return View(model);
}
所以,这将是你的默认ActionResult。它将验证WebGrid分页或排序事件是否调用了请求,以确定是返回filtred结果还是返回正常行为结果。
下一步是搜索POST ActionResult:
[HttpPost]
public ActionResult Index(SearchViewModel pesquisa) // IMPORTANT!! It is necessary to be the SAME NAME of your GET ActionResult. The reason for that I know, but won't discuss here because it goes out of the question.
{
SearchViewModel model = new SearchViewModel();
model.GridResult = ExecuteFilter(pesquisa); // Execute your filter
Session["SearchViewModel"] = model; //Save your filter parameters on Session.
return View("Index", model);
}
多数民众赞成。 Index.cshtml没有任何技巧。只是一个SearchForm到ActionResult索引,将我的SearchViewModel作为参数传递。
为什么这个解决方案有效?
好吧,当您单击以进行排序或分页时,WebGrid会执行类似于此的JavaScript:
$('#yourGrid')。load('它传递用于显示当前页面的URL,以及一些分页或排序参数,但这些参数由WebGrid使用') 因为它执行.load()方法,所以请求将是一个GET,并且会命中你的Index GET ActionResult。但它是一个AJAX调用,所以我们的魔术技巧将使用你在Session上保存的参数再次执行过滤器。
我提醒的唯一细节是关于您的默认网格行为。 GET索引ActionResult必须返回有效的网格结果,无论是否有会话过滤器。
答案 1 :(得分:0)
这应该对你有所帮助。 Link本文介绍了如何进行分页,并允许您保持数据源相同。
此外,通常在我进行过滤时,我会在javascript中使用过滤器的每个模型字段创建一个对象,然后在网格执行DataBinding事件时传入该对象。我主要和Telerik一起工作,所以我对Webgrids并不熟悉,否则我会给你一个例子。这基本上就是我做的。
查看
function onDataBinding(e) {
var searchModel = {
SearchName: $('#@Html.FieldIdFor(model => model.SearchName")').val(),
...
};
e.data = searchModel;
}
控制器
[GridAction(EnableCustomBinding = true)]
public ActionResult BackordersList(GridCommand command, SearchModel model)
{
var searchName = model.SearchName;
var gridData = _service.GetData(searchName);
model.GridData = new GridModel<Data>
{
Data = gridData.Select(PrepareModelForGrid),
Total = gridData.TotalCount
};
return new JsonResult
{
Data = model.GridData
};
}