jqgrid与asp.net webmethod和json使用排序,分页,搜索和LINQ – 但需要动态运算符
|
这个工作! ..但还需要一个东西… 好吧,所以这是一个“评论”和问题。首先,是可以帮助其他人搜索asp.net webmethod / jqGrid方法的工作示例。下面的代码完全工作,发送/接收JSON参数从和到jqGrid为了有正确的分页,排序,过滤(使用单一搜索)利用LINQ ..它使用片段从这里和那里… 第二,是我的问题: 我可能需要某种谓词构建器函数。 代码,处理此截至现在(它的工作,但是有限): if (isSearch) {
searchOper = getOperator(searchOper); // need to associate correct operator to value sent from jqGrid
string whereClause = String.Format("{0} {1} {2}",searchField,searchOper,"@" + searchField);
//--- associate value to field parameter
Dictionary<string,object> param = new Dictionary<string,object>();
param.Add("@" + searchField,searchString);
query = query.Where(whereClause,new object[1] { param });
}
随着节目……… ================================================== 首先,JAVASCRIPT <script type="text/javascript">
$(document).ready(function() {
var grid = $("#grid");
$("#grid").jqGrid({
// setup custom parameter names to pass to server
prmNames: {
search: "isSearch",nd: null,rows: "numRows",page: "page",sort: "sortField",order: "sortOrder"
},// add by default to avoid webmethod parameter conflicts
postData: { searchString: '',searchField: '',searchOper: '' },// setup ajax call to webmethod
datatype: function(postdata) {
$(".loading").show(); // make sure we can see loader text
$.ajax({
url: 'PageName.aspx/getGridData',type: "POST",contentType: "application/json; charset=utf-8",data: JSON.stringify(postdata),dataType: "json",success: function(data,st) {
if (st == "success") {
var grid = $("#grid")[0];
grid.addJSONData(JSON.parse(data.d));
}
},error: function() {
alert("Error with AJAX callback");
}
});
},// this is what jqGrid is looking for in json callback
jsonReader: {
root: "rows",total: "totalpages",records: "totalrecords",cell: "cell",id: "id",//index of the column with the PK in it
userdata: "userdata",repeatitems: true
},colNames: ['Id','First Name','Last Name'],colModel: [
{ name: 'id',index: 'id',width: 55,search: false },{ name: 'fname',index: 'fname',width: 200,searchoptions: { sopt: ['eq','ne','cn']} },{ name: 'lname',index: 'lname','cn']} }
],rowNum: 10,rowList: [10,20,30],pager: jQuery("#pager"),sortname: "fname",sortorder: "asc",viewrecords: true,caption: "Grid Title Here",gridComplete: function() {
$(".loading").hide();
}
}).jqGrid('navGrid','#pager',{ edit: false,add: false,del: false },{},// default settings for edit
{},// add
{},// delete
{ cloSEOnEscape: true,closeAfterSearch: true},//search
{}
)
});
</script>
================================================== 第二,C#WEBMETHOD [WebMethod]
public static string getGridData(int? numRows,int? page,string sortField,string sortOrder,bool isSearch,string searchField,string searchString,string searchOper) {
string result = null;
MyDataContext db = null;
try {
//--- retrieve the data
db = new MyDataContext("my connection string path");
var query = from u in db.TBL_USERs
select new User {
id = u.REF_ID,lname = u.LAST_NAME,fname = u.FIRST_NAME
};
//--- determine if this is a search filter
if (isSearch) {
searchOper = getOperator(searchOper); // need to associate correct operator to value sent from jqGrid
string whereClause = String.Format("{0} {1} {2}","@" + searchField);
//--- associate value to field parameter
Dictionary<string,object>();
param.Add("@" + searchField,searchString);
query = query.Where(whereClause,new object[1] { param });
}
//--- setup calculations
int pageIndex = page ?? 1; //--- current page
int pageSize = numRows ?? 10; //--- number of rows to show per page
int totalRecords = query.Count(); //--- number of total items from query
int totalPages = (int)Math.Ceiling((decimal)totalRecords / (decimal)pageSize); //--- number of pages
//--- filter dataset for paging and sorting
IQueryable<User> orderedRecords = query.OrderBy(sortfield);
IEnumerable<User> sortedRecords = orderedRecords.ToList();
if (sortorder == "desc") sortedRecords= sortedRecords.Reverse();
sortedRecords = sortedRecords
.Skip((pageIndex - 1) * pageSize) //--- page the data
.Take(pageSize);
//--- format json
var jsonData = new {
totalpages = totalPages,//--- number of pages
page = pageIndex,//--- current page
totalrecords = totalRecords,//--- total items
rows = (
from row in sortedRecords
select new {
i = row.id,cell = new string[] {
row.id.ToString(),row.fname,row.lname
}
}
).ToArray()
};
result = Newtonsoft.Json.JsonConvert.SerializeObject(jsonData);
} catch (Exception ex) {
Debug.WriteLine(ex);
} finally {
if (db != null) db.Dispose();
}
return result;
}
/* === User Object =========================== */
public class User {
public int id { get; set; }
public string lname { get; set; }
public string fname { get; set; }
}
================================================== 第三,事实 >为了在LINQ中有动态的OrderBy子句,我不得不把一个类拖到我的AppCode文件夹,名为’Dynamic.cs’。您可以从downloading here检索文件。您将在“DynamicQuery”文件夹中找到该文件。该文件将使您能够使用动态ORDERBY子句,因为我们不知道除了初始加载之外,我们要过滤的列。 将参数从JS获取到WebMethod的关键,而不必解析后端的非序列化字符串或者必须设置一些JS逻辑来切换不同数量的参数的方法是这个块 postData: { searchString: '',
当您实际执行搜索时,这些参数仍将正确设置,然后在“重置”或希望网格不进行任何过滤时将其重置为空 希望这有助于其他人!并且感谢您有时间阅读和回复关于在运行时与操作符构建whereclause的动态方法 解决方法考虑这个扩展方法,将字符串转换为MemberExpression:public static class StringExtensions
{
public static MemberExpression ToMemberExpression(this string source,ParameterExpression p)
{
if (p == null)
throw new ArgumentNullException("p");
string[] properties = source.Split('.');
Expression expression = p;
Type type = p.Type;
foreach (var prop in properties)
{
var property = type.GetProperty(prop);
if (property == null)
throw new ArgumentException("Invalid expression","source");
expression = Expression.MakeMemberAccess(expression,property);
type = property.PropertyType;
}
return (MemberExpression)expression;
}
}
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 让Visual Studios使用子域名?
- asp.net – Razor 3有什么新功能?
- asp.net-mvc – ASP.NET MVC路由冲突 – 输入变量的null值
- 动态渲染asp:从ASP.NET中的BLOB条目的图像
- asp.net-mvc – 当它被称为DocumentationController时,MVC控
- asp.net – HttpRuntime Cache和HttpContext Cache有什么区
- ASP.NET AJAX:在页面加载完成后触发UpdatePanel
- asp.net-mvc – 保存为“BodyPart_3ded2bfb-40be-4183-b789
- asp.net – 以URL结尾的问题
- asp.net-mvc-3 – DropDownListFor中的ViewBag属性值,而不是
- ASP.NET web.config文件是否失控?
- asp.net – 网站随时随地突破
- asp.net-mvc-3 – ASP.NET MVC – 不同角色的菜单
- asp.net-mvc – HttpResponseException和HttpExc
- 在IIS托管的asp.net Web应用程序中打开页面时“无
- asp.net-mvc – DAL – BLL - GUI组合根.如何设置
- asp.net-mvc – 如何在DropDownListFor的扩展中添
- 从ASP.NET应用程序直接将文件上传到Amazon S3
- asp.net-mvc – 我需要有关HandleError的更多信息
- asp.net-mvc – 可以在ASP.NET MVC中本地化URL /
