ASP.NET 动态属性筛选和分页绑定
我们先建立一个产品属性名称表
- CREATE TABLE ProductAttr
- (
- [ID] [int] IDENTITY(1,1) NOT NULL primary key,
- [ParentID] [int] NULL,
- [Kind] [int] NULL,
- [CNName] [nvarchar](50) NOT NULL,
- [ENName] [nvarchar](50) NOT NULL,
- [Sort] [int] NOT NULL,
- [AddTime] [datetime],
- )
再建一个属性内容表
- CREATE TABLE ProductAttrInfo
- (
- [ID] [int] IDENTITY(1,1) NOT NULL primary key,
- [ParentID] [int] NULL,
- [CNName] [nvarchar](50) NOT NULL,
- [Sort] [int] NOT NULL,
- [AddTime] [datetime] NOT NULL,
- [Color] [nvarchar](50) NULL,
- )
产品表叫Product
页面呈现效果为:
其中的产品分类、形状、其他为动态的产品属性名称,对象相关的属性内容。
我们首页要把相关的内容绑定,然后再根据传参,把相关的属性编号和内容编号,通过正则的方式找出来,然后把当前也是和属性内容的ID找出来,方便我们查询产品。
- /// <summary>
- /// 通过正则,把相关的属性ID拿到,然后判断属性名称ID的值即为属性值的ID值
- /// </summary>
- /// <param name="ids"></param>
- /// <returns></returns>
- protected int getAttrSql(int ids)
- {
- int value = ;
- string url = Request.Url.ToString().ToLower();
- if (url.IndexOf("?") >= )
- {
- string index = url.Remove(, url.IndexOf("?") + );
- string para = index.Replace("?", "");
- //切割成一个一个的参数并转换成SQL语句
- string[] ps = para.Split('&');
- string sql = "";
- for (int i = ; i < ps.Length; i++)
- {
- string s = ps[i];
- //检查参数是否是p\d*=\d*开头的,如果是则认为这个参数是属性的参数
- if (System.Text.RegularExpressions.Regex.IsMatch(s, @"p\d{1,}=\d{1,}"))
- {
- //去掉p切割成数字
- string[] pp = s.Replace("p", "").Split('=');
- int c = int.Parse(pp[].ToString());
- if (c == ids)
- {
- value = int.Parse(pp[].ToString());
- break;
- }
- }
- }
- }
- return value;
- }
- /// <summary>
- /// 绑定相关属性名称和内容,其中参数one和two,我这里是一级二级产品编号,可以忽略,ParentID为一级产品分类的ID,Kind为二级产品分类的ID
- /// </summary>
- /// <param name="one"></param>
- /// <param name="two"></param>
- public void BindAttrInfo(Model.ProductType one, Model.ProductType two)
- {
- StringBuilder sb = new StringBuilder();
- //if (two != null)
- //{
- // List<Model.ProductAttr> list = new BLL.ProductAttr().GetList(0, "CNName,ID", "ParentID=" + one.ID + " and Kind=" + two.ID + "", "Sort desc,AddTime desc");
- // foreach (Model.ProductAttr l in list)
- // {
- // sb.AppendFormat("<dl class=\"clearfix\"><dt>{0}</dt>", l.CNName);
- // List<Model.ProductAttrInfo> list2 = new BLL.ProductAttrInfo().GetList(0, "CNName,ID", "Pid=" + l.ID + "", "Sort desc,AddTime desc");
- // if (list2.Count > 0)
- // {
- // sb.AppendFormat("<dd><a href=\"{0}\" {1}>全部</a>", getUrl("p" + l.ID.Value, ""), getAttrSql(l.ID.Value) <= 0 ? "class=\"cur\"" : "");
- // foreach (Model.ProductAttrInfo l2 in list2)
- // {
- // 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);
- // }
- // sb.AppendFormat("</dd>");
- // }
- // sb.Append("</dl>");
- // }
- //}
- //else
- //{
- List<Model.ProductType> twoType = new BLL.ProductType().GetList(, "CNName,ID", "IsPass=1 and Kind=" + one.ID + "", "Sort desc,AddTime desc");
- if (twoType.Count > )
- {
- sb.AppendFormat("<dl class=\"clearfix\"><dt>产品分类</dt><dd>");
- sb.AppendFormat("<a {1} href=\"/products/?ParentID={0}\">全部</a>", one.ID, Kind <= ? "class=\"cur\"" : "");
- foreach (Model.ProductType l in twoType)
- {
- 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\"" : "");
- }
- sb.AppendFormat("</dd></dl>");
- }
- List<Model.ProductAttr> list = new BLL.ProductAttr().GetList(, "CNName,ID", "ParentID=" + one.ID + " and Kind=0", "Sort desc,AddTime desc");
- foreach (Model.ProductAttr l in list)
- {
- sb.AppendFormat("<dl class=\"clearfix\"><dt>{0}</dt>", l.CNName);
- List<Model.ProductAttrInfo> list2 = new BLL.ProductAttrInfo().GetList(, "CNName,ID", "Pid=" + l.ID + "", "Sort desc,AddTime desc");
- if (list2.Count > )
- {
- sb.AppendFormat("<dd><a href=\"{0}\" {1}>全部</a>", getUrl("p" + l.ID.Value, ""), getAttrSql(l.ID.Value) <= ? "class=\"cur\"" : "");
- foreach (Model.ProductAttrInfo l2 in list2)
- {
- 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);
- }
- sb.AppendFormat("</dd>");
- }
- sb.Append("</dl>");
- }
- // }
- Lit_ProductAttrList.Text = sb.ToString();
- }
- /// <summary>
- /// 绑定产品
- /// </summary>
- public void BindProducts()
- {
- string where = "ParentID=" + ParentID + "";
- if (Kind > )
- {
- where += " and Kind=" + Kind + "";
- where += GetWhereAttr();
- }
- else
- {
- where += GetWhereAttr();
- }
- string strOrder = "Sort desc,AddTime desc";
- if (OrderBy == )
- {
- strOrder = "SaleNum desc,Sort desc,AddTime desc";
- }
- else if (OrderBy == )
- {
- strOrder = "SalPrice,Sort desc,AddTime desc";
- }
- Model.PageData<Model.Product> data = new BLL.Product().GetList(, base.PageIndex, "", where, strOrder);
- repList.DataSource = data.DataSoure;
- repList.DataBind();
- pgServer.RecordCount = data.Count;
- pgServer.UrlRewritePattern = getUrl("", "").Replace("#pro-list", "") + "&page={0}#pro-list";
- pgServer.PageSize = ;
- AllCount = data.Count;
- AllPage = data.PageCount;
- ThisPage = base.PageIndex;
- if (ThisPage < )
- {
- ThisPage = ;
- }
- if (AllPage == )
- {
- ThisPage = ;
- }
- pgServer.DataBind();
- }
- /// <summary>
- /// 获取Url
- /// </summary>
- /// <param name="name"></param>
- /// <param name="value"></param>
- /// <returns></returns>
- protected string getUrl(string name, string value)
- {
- string url = System.Text.RegularExpressions.Regex.Replace(Request.Url.Query.Trim(), @"^\?", "");
- url = System.Text.RegularExpressions.Regex.Replace(url, "^" + name + "=.*?&|" + name + "=.*?&", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
- url = System.Text.RegularExpressions.Regex.Replace(url, "&{0,1}" + name + "=.*", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
- url = System.Text.RegularExpressions.Regex.Replace(url, "^page=.*?&|page=.*?&", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
- url = System.Text.RegularExpressions.Regex.Replace(url, "&{0,1}page=.*", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
- if (url.Trim() == "")
- {
- return "/products/?" + name + "=" + value + "#pro-list";
- }
- return getReplaceUrl("/products/?" + name + "=" + value + "&" + url.Replace("#pro-list", "") + "#pro-list", "key");
- }
- /// <summary>
- /// 获取Url
- /// </summary>
- /// <param name="name"></param>
- /// <param name="value"></param>
- /// <returns></returns>
- protected string getReplaceUrl(string url, string name)
- {
- url = System.Text.RegularExpressions.Regex.Replace(url, "^" + name + "=.*?&|" + name + "=.*?&", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
- url = System.Text.RegularExpressions.Regex.Replace(url, "^page=.*?&|page=.*?&", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
- url = System.Text.RegularExpressions.Regex.Replace(url, "&{0,1}page=.*", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
- return url;
- }
- /// <summary>
- /// 获取属性条件-绑定
- /// </summary>
- /// <returns></returns>
- protected string GetWhereAttr(string where)
- {
- string value = "";
- string url = Request.Url.ToString().ToLower();
- if (url.IndexOf("?") >= )
- {
- string index = url.Remove(, url.IndexOf("?") + );
- string para = index.Replace("?", "");
- //切割成一个一个的参数并转换成SQL语句
- string[] ps = para.Split('&');
- string sql = "";
- for (int i = ; i < ps.Length; i++)
- {
- string s = ps[i];
- //检查参数是否是p\d*=\d*开头的,如果是则认为这个参数是属性的参数
- if (System.Text.RegularExpressions.Regex.IsMatch(s, @"p\d{1,}=\d{1,}"))
- {
- //去掉p切割成数字
- string[] pp = s.Replace("p", "").Split('=');
- int c = int.Parse(pp[].ToString());
- //c为属性内容的编号,根据程序自己做判断
- }
- }
- }
- return value;
- }
ASP.NET 动态属性筛选和分页绑定的更多相关文章
- 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 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第三篇:排序.筛选和分页 原文:Sort ...
- EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页
在前面的教程你实施了一套基本的 CRUD 操作,为Student实体的 web 页.在本教程中,您将添加排序. 筛选和分页到 StudentsIndex的功能.您还将创建一个页面,并简单分组. 下面的 ...
- ASP.NET MVC利用PagedList分页(二)PagedList+Ajax+JsRender
(原文) 昨天在ASP.NET MVC利用PagedList分页(一)的 最后一节提到,一个好的用户体验绝对不可能是点击下一页后刷新页面,所以今天来说说利用Ajax+PagedList实现无刷新(个人 ...
- MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页
这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第三篇:排序.筛选 ...
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- ASP.NET MVC学习之模型绑定(1)
一.前言 下面我们将开始学习模型绑定,通过下面的知识我们将能够理解ASP.NET MVC模型的模型绑定器是如何将http请求中的数据转换成模型的,其中我们重点讲述的是表单数据. 二.正文 1.简单类型 ...
- ASP.NET MVC- 使用PageList.Mvc分页
ASP.NET MVC中进行分页的方式有多种,在NuGet上有提供使用PagedList.PagedList.Mvc进行分页. 1. 通过NuGet引用PagedList.Mvc 在安装引用Paged ...
- Asp.net Mvc 中的模型绑定
asp.net mvc中的模型绑定可以在提交http请求的时候,进行数据的映射. 1.没有模型绑定的时候 public ActionResult Example0() { ) { string id ...
随机推荐
- 从内部剖析C# 集合之---- HashTable
这是我在博客园的第一篇文章,写的不好或有错误的地方,望各位大牛指出,不甚感激. 计划写几篇文章专门介绍HashTable,Dictionary,HashSet,SortedList,List 等集合对 ...
- Hbase 学习笔记(一) Hbase的物理模型 Hbase为每个值维护了一个多级索引,即<key, column family, column name, timestamp>
比如第一个region 代表 0-100 第二个region 代表 101 -200的 分的越多越不好管理,但同时方便了并行化处理,并发度越高,处理的越快.mapreduce就是按照rowkey的 ...
- jQuery遍历对象、数组、集合实例
1.jquery 遍历对象 复制代码代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ...
- noip2014 考试总结
noip:最初估分580,明间数据:570,初测估分:510-570,最终得分:570 这次noip怎么说呢,发挥的还是比较理想吧,不过还是犯了一些“低级错误”,虽然没有造成十分严重的后果,但是还是不 ...
- Tomcat架构(三)
嵌套组件 这些组件是针对Tocmat做的特定实现,他们的主要目的是使各种Tomcat容器可以完成各自的工作. 1.阀(Valve) valve是处理元素,它可以被包含在每个Tomcat容器的处理路径中 ...
- The Maximum Number of Strong Kings
poj2699:http://poj.org/problem?id=2699 题意:n个人,进行n*(n-1)/2场比赛,赢一场则得到一分.如果一个人打败了所有比他分数高的对手,或者他就是分数最高的, ...
- Android 文件上传 使用AsyncHttpClient开源框架
public void upload(View view) { AsyncHttpClient client = new AsyncHttpClient(); RequestParams reques ...
- 15个你不知道的杀手级Google Chrome功能
之前写过一篇我为什么使用Google Chrome浏览器,算是在使用了一段时间的Google Chrome后的一点粗浅认识,最近读到一篇文章15 Killer Google Chrome Featur ...
- 【HDOJ】1688 Sightseeing
Dijkstra求解次短路径,使用cnt和dis数组记录最小.次小的个数和长度.重写更新操作. /* 1688 */ #include <iostream> #include <st ...
- 【HDOJ】1829 A Bug's Life
并查集变型.题意就是x与y是互斥的,下列是否数据是否可保证x-y是否均为互斥. #include <cstdio> #include <cstring> #define MAX ...