分页控件为:AspNetPager.dll

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

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 动态属性筛选和分页绑定的更多相关文章

  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. Contest20140710 sequence

    sequence|sequence.in|sequence.out 题目描述: 给定一个整数K和长为N的数列{Ai},求有多少个子串(不含空串)的和为K的倍数.(在这里子串表示{A[i]..A[j]} ...

  2. Activity 怎样获得另一个xml布局文件的控件

    两个布局文件,一个main.xml,一个main2.xml,一个MActivity,在MActivity的onCreate()里设置的是setContentView(R.layout.main).现在 ...

  3. git在myelispse中的安装

    1.git在myelispse中的安装 http://blog.csdn.net/chinaonlyqiu/article/details/8830050

  4. Supporting Multiple Screens 翻译 支持各种屏幕(上)

    Supporting Multiple Screens 支持各种各样的屏幕尺寸.屏幕密度 Android runs on a variety of devices that offer differe ...

  5. Resharper中注释代码的快捷键

    Resharper中     Visual Studio中 注释代码        Ctrl+Alt+/             Ctrl+E+C 取消注释        Ctrl+Alt+/     ...

  6. position: absolute 的元素自动对齐父元素 border 外边缘

    Position with border outer edge CSS box-flex align-items justify-content

  7. Linux Shell编程(13)——数字常量

    除非一个数字有特别的前缀或符号,否则shell脚本把它当成十进制的数.一个前缀为0的数字是八进制数.一个前缀为0x的数字是十六进制数.一个数用内嵌的#来求值则看成BASE#NUMBER(有范围和符号限 ...

  8. ORA-12541: TNS: 无监听程序 怎么解决

    ORA-12541: TNS: 无监听程序 怎么解决? 刚学 oracle ORA-12541: TNS怎么回事,已经打开了所有的服务 fzxs 2008-3-14 下载知道客户端,10分钟内有问必答 ...

  9. iOS类的继承关系

  10. FPGA入门学习第一课:二分频器

    分频器还是比较简单的,一般的思路是:每数几个时钟就输出一个时钟.最简单的当数二分频器了,每当时钟上升沿(或下降沿)就把输出翻转一下.这样就刚好实现了二分频器了. 网上也搜到了最简实现”二分频最简单了, ...