下面我们来改造一下CreateQueryString方法:
CreateQueryString
1 private string CreateQueryString(NameValueCollection values) 2 { 3 var builder = new StringBuilder(); 4 if (_searchValues != null) 5 { 6 builder = GetSearchPage(values); 7 } 8 else 9 { 10 foreach (string key in values.Keys) 11 { 12 if (key == _pageQueryName) 13 //Don't re-add any existing 'page' variable to the querystring - this will be handled in CreatePageLink. 14 { 15 continue; 16 } 17 18 foreach (var value in values.GetValues(key)) 19 { 20 builder.AppendFormat("&{0}={1}", key, HttpUtility.UrlEncode(value)); 21 } 22 } 23 } 24 25 26 return builder.ToString(); 27 } 28 /// <summary> 29 /// 根据传入的_searchValues来组织分页字符串 30 /// </summary> 31 /// <param name="values"></param> 32 /// <returns></returns> 33 private StringBuilder GetSearchPage(NameValueCollection values) 34 { 35 var builder = new StringBuilder(); 36 Dictionary<string, string> dictionary = new Dictionary<string, string>(); 37 foreach (var item in _searchValues) 38 { 39 dictionary.Add(item.Key, item.Value); 40 } 41 foreach (string key in values.Keys) 42 { 43 if (key == _pageQueryName) 44 //Don't re-add any existing 'page' variable to the querystring - this will be handled in CreatePageLink. 45 { 46 continue; 47 } 48 49 foreach (var value in values.GetValues(key)) 50 { 51 if (_searchValues.Keys.Contains(key)) 52 { 53 builder.AppendFormat("&{0}={1}", key, HttpUtility.UrlEncode(dictionary[key])); 54 dictionary.Remove(key); 55 } 56 else 57 { 58 builder.AppendFormat("&{0}={1}", key, HttpUtility.UrlEncode(value)); 59 } 60 61 } 62 63 } 64 foreach (var item in dictionary) 65 { 66 builder.AppendFormat("&{0}={1}", item.Key, HttpUtility.UrlEncode(item.Value)); 67 68 } 69 return builder; 70 } |
这里边主要添加的就是这个GetSearchPage方法,这个方法就是根据客户端传入的查询条件来组织显示分页字符串的。
五、缺点:
因为时使用附加url的方式实现的,所以对于查询条件过多的时候可能有问题,有空我会再实现一个post方案供大家参考。另外这里大家还需要注意的就是url中的查询字符串的名字不能重复,如果重复会直接被替换,详见源码。
六、源码