如何在分页webgrid时保持过滤结果

时间:2013-03-19 17:00:31

标签: asp.net-mvc-3 c#-4.0 webgrid

我使用MVC3开发系统,并且为了渲染Grid,有必要使用WebGrid。 我有一个ActionResult,它返回包含空网格的Index页面。 我有另一个ActionResult接收这些过滤器参数,执行过滤器查询并返回填充的网格。 当我分页这个网格时,网格返回空,因为它调用了Index ActionResult。

  • 所以我的问题是如何在分页webgrid时保留这些过滤结果?

2 个答案:

答案 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
        };
    }