分页控件为:AspNetPager.dll

我们先建立一个产品属性名称表

  1. CREATE TABLE ProductAttr
  2. (
  3. [ID] [int] IDENTITY(1,1) NOT NULL primary key,
  4. [ParentID] [int] NULL,
  5. [Kind] [int] NULL,
  6. [CNName] [nvarchar](50) NOT NULL,
  7. [ENName] [nvarchar](50) NOT NULL,
  8. [Sort] [int] NOT NULL,
  9. [AddTime] [datetime],
  10. )

再建一个属性内容表

  1. CREATE TABLE ProductAttrInfo
  2. (
  3. [ID] [int] IDENTITY(1,1) NOT NULL primary key,
  4. [ParentID] [int] NULL,
  5. [CNName] [nvarchar](50) NOT NULL,
  6. [Sort] [int] NOT NULL,
  7. [AddTime] [datetime] NOT NULL,
  8. [Color] [nvarchar](50) NULL,
  9. )

产品表叫Product

页面呈现效果为:

其中的产品分类、形状、其他为动态的产品属性名称,对象相关的属性内容。

我们首页要把相关的内容绑定,然后再根据传参,把相关的属性编号和内容编号,通过正则的方式找出来,然后把当前也是和属性内容的ID找出来,方便我们查询产品。

  1. /// <summary>
  2. /// 通过正则,把相关的属性ID拿到,然后判断属性名称ID的值即为属性值的ID值
  3. /// </summary>
  4. /// <param name="ids"></param>
  5. /// <returns></returns>
  6. protected int getAttrSql(int ids)
  7. {
  8. int value = ;
  9. string url = Request.Url.ToString().ToLower();
  10. if (url.IndexOf("?") >= )
  11. {
  12. string index = url.Remove(, url.IndexOf("?") + );
  13. string para = index.Replace("?", "");
  14. //切割成一个一个的参数并转换成SQL语句
  15. string[] ps = para.Split('&');
  16. string sql = "";
  17. for (int i = ; i < ps.Length; i++)
  18. {
  19. string s = ps[i];
  20. //检查参数是否是p\d*=\d*开头的,如果是则认为这个参数是属性的参数
  21. if (System.Text.RegularExpressions.Regex.IsMatch(s, @"p\d{1,}=\d{1,}"))
  22. {
  23. //去掉p切割成数字
  24. string[] pp = s.Replace("p", "").Split('=');
  25. int c = int.Parse(pp[].ToString());
  26. if (c == ids)
  27. {
  28. value = int.Parse(pp[].ToString());
  29. break;
  30. }
  31. }
  32. }
  33. }
  34. return value;
  35. }
  1. /// <summary>
  2. /// 绑定相关属性名称和内容,其中参数one和two,我这里是一级二级产品编号,可以忽略,ParentID为一级产品分类的ID,Kind为二级产品分类的ID
  3. /// </summary>
  4. /// <param name="one"></param>
  5. /// <param name="two"></param>
  6. public void BindAttrInfo(Model.ProductType one, Model.ProductType two)
  7. {
  8. StringBuilder sb = new StringBuilder();
  9. //if (two != null)
  10. //{
  11. // List<Model.ProductAttr> list = new BLL.ProductAttr().GetList(0, "CNName,ID", "ParentID=" + one.ID + " and Kind=" + two.ID + "", "Sort desc,AddTime desc");
  12. // foreach (Model.ProductAttr l in list)
  13. // {
  14. // sb.AppendFormat("<dl class=\"clearfix\"><dt>{0}</dt>", l.CNName);
  15. // List<Model.ProductAttrInfo> list2 = new BLL.ProductAttrInfo().GetList(0, "CNName,ID", "Pid=" + l.ID + "", "Sort desc,AddTime desc");
  16. // if (list2.Count > 0)
  17. // {
  18. // sb.AppendFormat("<dd><a href=\"{0}\" {1}>全部</a>", getUrl("p" + l.ID.Value, ""), getAttrSql(l.ID.Value) <= 0 ? "class=\"cur\"" : "");
  19. // foreach (Model.ProductAttrInfo l2 in list2)
  20. // {
  21. // sb.AppendFormat("<a href=\"{0}\" {1}>{2}</a>", getUrl("p" + l.ID.Value, l2.ID.Value.ToString()), getAttrSql(l.ID.Value) == l2.ID.Value ? "class=\"cur\"" : "", l2.CNName);
  22. // }
  23. // sb.AppendFormat("</dd>");
  24. // }
  25. // sb.Append("</dl>");
  26. // }
  27. //}
  28. //else
  29. //{
  30. List<Model.ProductType> twoType = new BLL.ProductType().GetList(, "CNName,ID", "IsPass=1 and Kind=" + one.ID + "", "Sort desc,AddTime desc");
  31. if (twoType.Count > )
  32. {
  33. sb.AppendFormat("<dl class=\"clearfix\"><dt>产品分类</dt><dd>");
  34. sb.AppendFormat("<a {1} href=\"/products/?ParentID={0}\">全部</a>", one.ID, Kind <= ? "class=\"cur\"" : "");
  35. foreach (Model.ProductType l in twoType)
  36. {
  37. sb.AppendFormat("<a href=\"/products/?ParentID={0}&Kind={1}\" {3}>{2}</a>", one.ID.Value, l.ID.Value, l.CNName, Kind == l.ID.Value ? "class=\"cur\"" : "");
  38. }
  39. sb.AppendFormat("</dd></dl>");
  40. }
  41. List<Model.ProductAttr> list = new BLL.ProductAttr().GetList(, "CNName,ID", "ParentID=" + one.ID + " and Kind=0", "Sort desc,AddTime desc");
  42. foreach (Model.ProductAttr l in list)
  43. {
  44. sb.AppendFormat("<dl class=\"clearfix\"><dt>{0}</dt>", l.CNName);
  45. List<Model.ProductAttrInfo> list2 = new BLL.ProductAttrInfo().GetList(, "CNName,ID", "Pid=" + l.ID + "", "Sort desc,AddTime desc");
  46. if (list2.Count > )
  47. {
  48. sb.AppendFormat("<dd><a href=\"{0}\" {1}>全部</a>", getUrl("p" + l.ID.Value, ""), getAttrSql(l.ID.Value) <= ? "class=\"cur\"" : "");
  49. foreach (Model.ProductAttrInfo l2 in list2)
  50. {
  51. sb.AppendFormat("<a href=\"{0}\" {1}>{2}</a>", getUrl("p" + l.ID.Value, l2.ID.Value.ToString()), getAttrSql(l.ID.Value) == l2.ID.Value ? "class=\"cur\"" : "", l2.CNName);
  52. }
  53. sb.AppendFormat("</dd>");
  54. }
  55. sb.Append("</dl>");
  56. }
  57. // }
  58. Lit_ProductAttrList.Text = sb.ToString();
  59. }
  1. /// <summary>
  2. /// 绑定产品
  3. /// </summary>
  4. public void BindProducts()
  5. {
  6. string where = "ParentID=" + ParentID + "";
  7. if (Kind > )
  8. {
  9. where += " and Kind=" + Kind + "";
  10.  
  11. where += GetWhereAttr();
  12. }
  13. else
  14. {

  15. where += GetWhereAttr();
  16. }
  17.  
  18. string strOrder = "Sort desc,AddTime desc";
  19. if (OrderBy == )
  20. {
  21. strOrder = "SaleNum desc,Sort desc,AddTime desc";
  22. }
  23. else if (OrderBy == )
  24. {
  25. strOrder = "SalPrice,Sort desc,AddTime desc";
  26. }
  27.  
  28. Model.PageData<Model.Product> data = new BLL.Product().GetList(, base.PageIndex, "", where, strOrder);
  29. repList.DataSource = data.DataSoure;
  30. repList.DataBind();
  31. pgServer.RecordCount = data.Count;
  32. pgServer.UrlRewritePattern = getUrl("", "").Replace("#pro-list", "") + "&page={0}#pro-list";
  33. pgServer.PageSize = ;
  34. AllCount = data.Count;
  35. AllPage = data.PageCount;
  36. ThisPage = base.PageIndex;
  37. if (ThisPage < )
  38. {
  39. ThisPage = ;
  40. }
  41. if (AllPage == )
  42. {
  43. ThisPage = ;
  44. }
  45. pgServer.DataBind();
  46.  
  47. }
  1. /// <summary>
  2. /// 获取Url
  3. /// </summary>
  4. /// <param name="name"></param>
  5. /// <param name="value"></param>
  6. /// <returns></returns>
  7. protected string getUrl(string name, string value)
  8. {
  9. string url = System.Text.RegularExpressions.Regex.Replace(Request.Url.Query.Trim(), @"^\?", "");
  10. url = System.Text.RegularExpressions.Regex.Replace(url, "^" + name + "=.*?&|" + name + "=.*?&", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  11. url = System.Text.RegularExpressions.Regex.Replace(url, "&{0,1}" + name + "=.*", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  12. url = System.Text.RegularExpressions.Regex.Replace(url, "^page=.*?&|page=.*?&", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  13. url = System.Text.RegularExpressions.Regex.Replace(url, "&{0,1}page=.*", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  14. if (url.Trim() == "")
  15. {
  16. return "/products/?" + name + "=" + value + "#pro-list";
  17. }
  18. return getReplaceUrl("/products/?" + name + "=" + value + "&" + url.Replace("#pro-list", "") + "#pro-list", "key");
  19. }
  20. /// <summary>
  21. /// 获取Url
  22. /// </summary>
  23. /// <param name="name"></param>
  24. /// <param name="value"></param>
  25. /// <returns></returns>
  26. protected string getReplaceUrl(string url, string name)
  27. {
  28. url = System.Text.RegularExpressions.Regex.Replace(url, "^" + name + "=.*?&|" + name + "=.*?&", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  29. url = System.Text.RegularExpressions.Regex.Replace(url, "^page=.*?&|page=.*?&", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  30. url = System.Text.RegularExpressions.Regex.Replace(url, "&{0,1}page=.*", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  31.  
  32. return url;
  33. }
  1. /// <summary>
  2. /// 获取属性条件-绑定
  3. /// </summary>
  4. /// <returns></returns>
  5. protected string GetWhereAttr(string where)
  6. {
  7. string value = "";
  8. string url = Request.Url.ToString().ToLower();
  9. if (url.IndexOf("?") >= )
  10. {
  11. string index = url.Remove(, url.IndexOf("?") + );
  12. string para = index.Replace("?", "");
  13. //切割成一个一个的参数并转换成SQL语句
  14. string[] ps = para.Split('&');
  15. string sql = "";
  16. for (int i = ; i < ps.Length; i++)
  17. {
  18. string s = ps[i];
  19. //检查参数是否是p\d*=\d*开头的,如果是则认为这个参数是属性的参数
  20. if (System.Text.RegularExpressions.Regex.IsMatch(s, @"p\d{1,}=\d{1,}"))
  21. {
  22. //去掉p切割成数字
  23. string[] pp = s.Replace("p", "").Split('=');
  24. int c = int.Parse(pp[].ToString());
  25. //c为属性内容的编号,根据程序自己做判断
  26. }
  27. }
  28. }
  29. return value;
  30. }

ASP.NET 动态属性筛选和分页绑定的更多相关文章

  1. 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 ...

  2. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第三篇:排序.筛选和分页 原文:Sort ...

  3. EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

    在前面的教程你实施了一套基本的 CRUD 操作,为Student实体的 web 页.在本教程中,您将添加排序. 筛选和分页到 StudentsIndex的功能.您还将创建一个页面,并简单分组. 下面的 ...

  4. ASP.NET MVC利用PagedList分页(二)PagedList+Ajax+JsRender

    (原文) 昨天在ASP.NET MVC利用PagedList分页(一)的 最后一节提到,一个好的用户体验绝对不可能是点击下一页后刷新页面,所以今天来说说利用Ajax+PagedList实现无刷新(个人 ...

  5. MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页

    这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第三篇:排序.筛选 ...

  6. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  7. ASP.NET MVC学习之模型绑定(1)

    一.前言 下面我们将开始学习模型绑定,通过下面的知识我们将能够理解ASP.NET MVC模型的模型绑定器是如何将http请求中的数据转换成模型的,其中我们重点讲述的是表单数据. 二.正文 1.简单类型 ...

  8. ASP.NET MVC- 使用PageList.Mvc分页

    ASP.NET MVC中进行分页的方式有多种,在NuGet上有提供使用PagedList.PagedList.Mvc进行分页. 1. 通过NuGet引用PagedList.Mvc 在安装引用Paged ...

  9. Asp.net Mvc 中的模型绑定

    asp.net mvc中的模型绑定可以在提交http请求的时候,进行数据的映射. 1.没有模型绑定的时候 public ActionResult Example0() { ) { string id ...

随机推荐

  1. 从内部剖析C# 集合之---- HashTable

    这是我在博客园的第一篇文章,写的不好或有错误的地方,望各位大牛指出,不甚感激. 计划写几篇文章专门介绍HashTable,Dictionary,HashSet,SortedList,List 等集合对 ...

  2. Hbase 学习笔记(一) Hbase的物理模型 Hbase为每个值维护了一个多级索引,即<key, column family, column name, timestamp>

      比如第一个region 代表 0-100 第二个region 代表 101 -200的 分的越多越不好管理,但同时方便了并行化处理,并发度越高,处理的越快.mapreduce就是按照rowkey的 ...

  3. jQuery遍历对象、数组、集合实例

    1.jquery 遍历对象 复制代码代码如下:   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ...

  4. noip2014 考试总结

    noip:最初估分580,明间数据:570,初测估分:510-570,最终得分:570 这次noip怎么说呢,发挥的还是比较理想吧,不过还是犯了一些“低级错误”,虽然没有造成十分严重的后果,但是还是不 ...

  5. Tomcat架构(三)

    嵌套组件 这些组件是针对Tocmat做的特定实现,他们的主要目的是使各种Tomcat容器可以完成各自的工作. 1.阀(Valve) valve是处理元素,它可以被包含在每个Tomcat容器的处理路径中 ...

  6. The Maximum Number of Strong Kings

    poj2699:http://poj.org/problem?id=2699 题意:n个人,进行n*(n-1)/2场比赛,赢一场则得到一分.如果一个人打败了所有比他分数高的对手,或者他就是分数最高的, ...

  7. Android 文件上传 使用AsyncHttpClient开源框架

    public void upload(View view) { AsyncHttpClient client = new AsyncHttpClient(); RequestParams reques ...

  8. 15个你不知道的杀手级Google Chrome功能

    之前写过一篇我为什么使用Google Chrome浏览器,算是在使用了一段时间的Google Chrome后的一点粗浅认识,最近读到一篇文章15 Killer Google Chrome Featur ...

  9. 【HDOJ】1688 Sightseeing

    Dijkstra求解次短路径,使用cnt和dis数组记录最小.次小的个数和长度.重写更新操作. /* 1688 */ #include <iostream> #include <st ...

  10. 【HDOJ】1829 A Bug's Life

    并查集变型.题意就是x与y是互斥的,下列是否数据是否可保证x-y是否均为互斥. #include <cstdio> #include <cstring> #define MAX ...