WebGrid with filtering, paging and sorting 【转】
WebGrid with filtering, paging and sorting
by Jose M. Aguilar on April 24, 2012 in Web Development
A few days ago I received some questions on the use of the Webgrid helper in the comments section of my personal blog, specifically on how to implement custom filters on the data displayed. Since it’s not easy to answer through the comments section, I have forced myself to write an article on it. Here it is.
The main obstacle here is that WebGrid doesn’t include any kind of tool to perform this frequent task. It simply displays the data we provide, and if we want to filter we have to do it manually. In theory, it would be enough to just to supply the Controller the filters we want to apply. Then the Controller queries the info from the Model following the criteria set.
However, something that may seem relatively simple gets harder if we want to also keep the sort order and paging capabilities untouched because we have to arrange for state maintenance between requests as well. Well, this is something we can solve in a few minutes ;-)
Starting out from the project developed in this post of the series on Webgrid, let’s see how we can add a couple of search criteria to the grid, so it can appear to be this way:
The text field enables us to look for substrings in the names and surnames of the people stored in the database, and the other two fields allow to filter by range (min-max) the children they have. As usual, we’ll combine these conditions with a logic AND.
1. The View
First, we enter the form we are going to use to request the user the search criteria in the view, right before generating the grid:
The code is as follows:
@using(Html.BeginForm(null, null, FormMethod.Get))
{
<fieldset>
<legend>Search criteria</legend>
@Html.Label("search", "Text:")
@Html.TextBox("search")
@Html.Label("minChildren", "Children min:")
@Html.TextBox("minChildren", null, new { @class="num" })
@Html.Label("maxChildren", "Children max:")
@Html.TextBox("maxChildren", null, new { @class="num"} )
<input type="submit" value="Apply" />
</fieldset>
}
Notice the simplicity of the form. We don’t even have to use the lambda syntax in the edit helpers. We generate the controllers starting out from the fields whose values will be in the query string (and not from the Model, which is the usual thing to do). For this reason, notice that the form is set to be sent using the HTTP GET method.
This way we can propagate easily the values of the controls (textbox) between calls:
- if the user enters criteria and clicks the send button, the URL the request is performed on will be, for instance, /friends/index?search=aguilar&minChildren=1&maxChildren=4.
- if the user uses the grid’s navigation buttons (next/previous page, go to page, or reorder), these parameters will be added to the previous ones, and therefore they preserve their values between the different calls. This is because Webgrid generates the links to these actions preserving the current query string parameters. In other words, if we are filtering and we go to page 4, we access an address that includes both the search criteria info as well as the paging, something like: /friends/index?search=aguilar&minChildren=1&maxChildren=4&page=4.
And by doing so, we the view layer is finished.
2. The controller
The action method in charge of getting the grid data and sending the view with the data to the user receives three parameters: current page, sort order field and its direction (ascending/descending).
Since now we have to get the sort order criteria, we have to extend its definition adding parameters for these values:
public ActionResult Index(int page = 1, string sort = "surname",
string sortDir = "ASC", string search = null,
int? minChildren = null, int? maxChildren = null)
See how all the parameters are optional, and we set them to null to easily detect when they come filled.
And at which point do we need to use these new parameters? Only in two:
- in the call we make to the Model to count the total amount of grid rows. We have to inform the grid on the filtering criteria so the counting is performed properly.
- in the call we make to the Model to get the rows to be displayed in the current page, where we obviously have to take into account the filters.
The action is results somewhat like this:
public ActionResult Index(int page = 1, string sort = "surname",
string sortDir = "ASC", string search = null,
int? minChildren = null,
int? maxChildren = null)
{
var friendsCount = _services.GetFriendsCount(search, minChildren, maxChildren);
var friends = _services.GetFriendsPage(page, FRIENDS_PER_PAGE, sort, sortDir,
search, minChildren, maxChildren); var data = new FriendsPageViewModel()
{
NumberOfFriends = friendsCount,
FriendsPerPage = FRIENDS_PER_PAGE,
Friends = friends
}; return View(data);
}
And this is all in the comtroller.
3. The Model
And at last, now in the Model, we have to make the methods used from the controller (GetFriendsCount and GetFriendsPage) take into account the parameters in which we indicate the search conditions.
In the first one, we simply return the number of people which follow the criteria returned as parameters:
public int GetFriendsCount(string searchText = null, int? minChildren = null,
int? maxChildren = null)
{
IQueryable<Friend> query = _data.People;
query = filterPeople(searchText, minChildren, maxChildren, query);
return query.Count();
}
The helper method filterPeople() we use is only in charge of adding the where clauses to the query that we need to take into account the specified conditions:
private static IQueryable<Friend> filterPeople(
string searchText, int? minChildren,
int? maxChildren, IQueryable<Friend> query)
{
if (!string.IsNullOrWhiteSpace(searchText))
query = query.Where(p => p.Name.Contains(searchText)
|| p.Surname.Contains(searchText));
if (maxChildren != null)
query = query.Where(p => p.Children <= maxChildren);
if (minChildren != null)
query = query.Where(p => p.Children >= minChildren);
return query;
}
At last, we implement the method that obtains the data to display on the current page:
public IEnumerable<Friend> GetFriendsPage(int currentPage, int friendsPerPage,
string sortColumn, string sortDir,
string searchText, int? minChildren,
int? maxChildren)
{
// Validate input data
sortDir = sortDir.Equals("desc", StringComparison.CurrentCultureIgnoreCase) ?
sortDir : "asc"; var validColumns = new[] { "surname", "birthdate", "email", "children" };
if (!validColumns.Contains(sortColumn.ToLower()))
sortColumn = "surname"; if (currentPage < 1) currentPage = 1;
if (friendsPerPage < 1) friendsPerPage = 10; // Create the query
var query = (IQueryable<Friend>)_data.People
.OrderBy("it." + sortColumn + " " + sortDir); query = filterPeople(searchText, minChildren, maxChildren, query); return query
.Skip((currentPage - 1) * friendsPerPage)
.Take(friendsPerPage)
.ToList();
}
There is not much to say about this code. In first place, a basic check of the entry parameters is performed, and then generate the query to be performed on the database. As you can see, the Como podéis observar, the queryPeopleFiltered() method is performed to apply the query criteria.
Summarizing…
As we have seen, implementing search criteria in Webgrid doesn’t differ much from what we have described earlier on in my other posts about WebGrid. We just have take into account the following points:
- firstly, include a form in the View where the query criteria is collected in order to send it to the controller.
- secondly, prepare the Controller so it can receive this criteria and make it reach the Model.
- thirdly, in the Model, simply apply this criteria when countimg the total amount of rows, and when obtaining the data to be displayed in the grid page.
Here you can download the example code for this post.
WebGrid with filtering, paging and sorting 【转】的更多相关文章
- Spring REST实践之Versioning,Paging和Sorting
Versioning 为适应需求的变化以及兼容已有的API,需要创建新版本的API,一般有四种流行的版本化API的方法: URI版本化 URI参数版本化 Accept header版本化 自定义hea ...
- [转]Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application (3 of 10)
本文转自:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/sorting-fi ...
- [转]Paging, Searching and Sorting in ASP.Net MVC 5
本文转自:http://www.c-sharpcorner.com/UploadFile/4b0136/perform-paging-searching-sorting-in-Asp-Net-mvc- ...
- WebGrid Helper with Check All Checkboxes
WebGrid Helper with Check All Checkboxes myEvernote Link Tuesday, September 13, 2011ASP.NET ASP.NET ...
- [webgrid] – Ajax – (Reloading a Razor WebGrid after Ajax calls using a partial view)
Reloading a Razor WebGrid after Ajax calls using a partial view If you are using Razor and MVC you p ...
- [转]Efficiently Paging Through Large Amounts of Data
本文转自:http://msdn.microsoft.com/en-us/library/bb445504.aspx Scott Mitchell April 2007 Summary: This i ...
- ExtJS笔记 Proxy
Proxies are used by Stores to handle the loading and saving of Model data. Usually developers will n ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 排序、筛选、分页以及分组
Sorting, filtering, paging, and grouping 7 of 8 people found this helpful By Tom Dykstra The Contoso ...
- jQuery DataTables and ASP.NET MVC Integration
part 1 : http://www.codeproject.com/Articles/155422/jQuery-DataTables-and-ASP-NET-MVC-Integration-Pa ...
随机推荐
- js-读取上传文件后缀
/** * 读取文件后缀名称,并转化成小写 * @param file_name * @returns */ function houzuiToLowerCase(file_name) { if (f ...
- BZOJ 1116: [POI2008]CLO
1116: [POI2008]CLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 922 Solved: 514[Submit][Status][ ...
- 为什么要用hibernate 与基于数据库表结构的项目开发
最近开始学习hibernate,其实并不知道要学习什么,有什么用.后来问了一下同事,他就说快捷方便简单,很多事情不用自己做他会帮你做好,但是我觉得不应该是这样的,于是我就去搜了一下,就搜到了一篇帖子, ...
- Linux下的删除命令
Linux:rm Windows:del rm parameter: -f, --force 忽略不存在的文件,从不给出提示.-i, --interactive 进行交互式删除-r, -R, - ...
- MAC上快速调出终端的设置(保持和Windows的操作一致)
在Windows上可以这样操作[Win+R]键->输入[cmd/cmder]打开终端. 在MAC下需要做些设置:打开[系统偏好设置]->打开[键盘]->打开[快捷键]->找到[ ...
- bios中只有windows boot manager下用U盘启动
在重装系统的时候,很多时候都是先进入bios设置成U盘启动项,然后进行安装,如果年代久远一点的,就设置成光驱启动,再进行:随着时间的推行,光驱已经开始淘汰了,也怀念以前的光驱装机的时光!-:) 开始进 ...
- [NOIP2013] 提高组 洛谷P1969 积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- shell 调试手段总结
对于厌烦了的 print 和 echo,可以尝试点新鲜省力的小手段. 1. 使用 shell 的执行选项 sh 和 bash 常用的执行指令有:-n.-x.-c.-v. 其中: -n 是 noexec ...
- GitBash上传代码不计入贡献的问题处理
发现最近写的代码,通过GitBash上传到github,但是格子确一个都没亮,今天通过一番检索解决了此问题,特做记录: 通过这篇文章找到了原因所在: GitHub 更新代码到底怎样才算贡献? 通过这篇 ...
- 单向关系中的JoinColumn
1.person与address的一对一单向关系: 在address中没有特殊的注解. 在Person中对应到数据库里面就有一个指向Address的外键. 我们也可以增加注释指定外键的列的名字,如下: ...