您的位置:首页 > 其它

(转)动态多条件查询分页以及排序(一)--MVC与Entity Framework版url分页版

2012-12-06 10:57 696 查看
原文地址:http://www.cnblogs.com/wlflovenet/archive/2012/12/04/MVC_EntityFramework_Query.html

一.前言

多条件查询分页以及排序 每个系统里都会有这个的代码 做好这块 可以大大提高开发效率 所以博主分享下自己的6个版本的 多条件查询分页以及排序

二.目前状况

不论是ado.net 还是EF 在做多条件搜索时 都有这类似的代码

View Code
通过上面的代码 就可以保存住以前的参数了 接着就是

dict["PageIndex"] = 1;//设置页码
@Html.RouteLink("首页", dict);


这样就可以设置分页 以及解耦控制器 和方法名了~

如果你设置了类似的路由

routes.MapRoute("Page", "{controller}/{action}/page{PageIndex}", new { controller = "WLFQuery", action = "Index", PageIndex = 1 });


那么也是支持的~

2.技巧二

因为我们的分页 支持通过下拉框选择页码后自动跳页 有点儿像webform 的autopostback 而我们又是get 提交版的 需要解决一个问题 选择后自动跳页 需要带上以前的查询条件 不能跳完页以后 查询条件消失了

这里采用的办法 借鉴了一下 aspnetpager 作者的 urlpager的思路

用一个隐藏的a 标签 这个a 标签生成的连接 保存了当前的查询条件等 他的页面数 显示成"*pageindex* 当我们选择下拉框跳页后 用选择的值 替换这个"*pageindex* 然后跳转到当前href 则解决了上述问题
上代码



<text>跳转至</text>
<select id="pageselect" onchange="selectchange()">
@for (int i = 1; i <=@Model.TotalPageCount; i++)
{
var selected = "";
if (i==Model.CurrentPageIndex)
{
selected = "selected='selected'";
}
<option value="@i" @selected>@i</option>
}
</select>

{
dict["PageIndex"] = "*pageindex*";
}
<a style="display:none" id="pagelink" href="@Url.RouteUrl(dict)" ></a>
//
<script type="text/javascript">

function selectchange() {
var pageselect = document.getElementById("pageselect");
var pageselectValue = pageselect.options[pageselect.selectedIndex].value;

var linkdom= document.getElementById("pagelink");
var href = linkdom.href;
href = href.replace("*pageindex*", pageselectValue);

window.location = href;

}
</script>

<text>页</text>




3.点击搜索时 get 提交 并回到第一页

<form action="@Url.Action("index", new { PageIndex = 1 })" method="get">
</form>


具体代码可以下载源码看~

七. URL GET提交的遗憾

上面基本功能已经实现 但是有些遗憾的是 大家知道 mvc没有viewstate机制 而且我们的又是URL分页 及时是webform 也会面临这个问题

虽然我们通过url保存了搜索的状态 但是没有解决点击分页后 搜索框的内容还在。所以会出来一个奇怪的现象 按条件搜索完 比如搜索姓名为hy的 然后点击分页 搜索框的内容没了

但是分页后内容却还是hy的 因为我们的url 里存的有搜索结果 但是重新加载后 文本框的内容却没了 这样虽然无伤大雅 但是还是略感不爽 如果非要解决 也不是没有办法 只是觉得都不是很完美

方案1.

ID(like操作): <input type="text" name="[Contains]StuId"  value="@Request.QueryString["[Contains]StuId"]" /><br />


因为我们的url里保存的有真实的搜索条件 所以我们可以通过Request.QueryString["[Contains]StuId"] 直接得到 但是我觉得在MVC里 出现Request.QueryString 这样的信息 不好看

方案2.

ViewContext.Controller.ValueProvider.GetValue("[Contains]StuId").RawValue 通过这样 也可以得到值

方案3.

在控制器里

ViewBag.Query = querymodel; 记录搜索条件 然后在view里读出来

QueryModel query=ViewBag.Query as QueryModel;
string StuId=query.Items.Where(x => x.Field == "StuId").Select(x=>x.Value).FirstOrDefault()!=null?query.Items.Where(x => x.Field == "StuId").Select(x=>x.Value).FirstOrDefault().ToString():"";


上面三个方式 感觉都有不完美的地方 因为我们还原的内容 不只是 text 有可能是 多选框 下拉列表 等 所以要做处理 就稍微麻烦了下 比如



string[] newarrlovewgril = (string[])arrlovegril;
MMischeck= newarrlovewgril.Contains("MM") ? "checked='checked'" : "";
LUCIischeck = newarrlovewgril.Contains("LILI") ? "checked='checked'" : "";
GAGAischeck = newarrlovewgril.Contains("GAGA") ? "checked='checked'" : "";

MM<input type="checkbox" name="lovegril" value="MM" @MMischeck />
LILI<input type="checkbox" name="lovegril" value="LILI" @LUCIischeck />
GAGA<input type="checkbox" name="lovegril"  value="GAGA" @GAGAischeck />




我再想 把这些还原也做成自动化的 不用任何代码的 求集思广益 希望大家给些建议

八.总结

EF实现动态查询以及排序的关键 就在于表达式树的构建。所以学会并理解表达式树很关键,这个不尽在这里有用,用来代替反射也可以提高效率~不过表达式树的生成 建议实际项目中 加上缓存。

表达式树的学习 可以看下这几篇
http://www.cnblogs.com/Terrylee/archive/2008/08/01/custom-linq-provider-part-1-expression-tree.html
/article/4797504.html
http://msdn.microsoft.com/en-us/library/bb397951.aspx
短短文章 花了半天才写完~ 希望对大家有帮助 或者能给大家一些启示 有问题可以留言交流 欢迎批评和建议 感谢阅读~

顺便帮忙宣传下 我在的两个QQ群吧 33353329 205217091 有兴趣的可以进来讨论

过几天介绍另两个版本 POST提交版和 MVC+EF AJAX 多条件查询 分页 排序

最后附上本节代码下载 (代码比较粗糙,主要做演示)

转载请说明来自 http://www.cnblogs.com/wlflovenet/archive/2012/11/30/MVC_EntityFramework_Query.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐