ASP.NET 动态属性筛选和分页绑定

分页控件为: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 = 0;
    string url = Request.Url.ToString().ToLower();
    if (url.IndexOf("?") >= 0)
    {
        string index = url.Remove(0, url.IndexOf("?") + 1);
        string para = index.Replace("?", "");
        //切割成一个一个的参数并转换成SQL语句
        string[] ps = para.Split(‘&‘);
        string sql = "";
        for (int i = 0; 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[0].ToString());
                if (c == ids)
                {
                    value = int.Parse(pp[1].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(0, "CNName,ID", "IsPass=1 and Kind=" + one.ID + "", "Sort desc,AddTime desc");
    if (twoType.Count > 0)
    {
        sb.AppendFormat("<dl class=\"clearfix\"><dt>产品分类</dt><dd>");
        sb.AppendFormat("<a {1} href=\"/products/?ParentID={0}\">全部</a>", one.ID, Kind <= 0 ? "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(0, "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(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>");
    }
    // }
    Lit_ProductAttrList.Text = sb.ToString();
}
/// <summary>
/// 绑定产品
/// </summary>
public void BindProducts()
{
    string where = "ParentID=" + ParentID + "";
    if (Kind > 0)
    {
        where += " and Kind=" + Kind + "";

        where += GetWhereAttr();
    }
    else
    {
        where += GetWhereAttr();
    }

    string strOrder = "Sort desc,AddTime desc";
    if (OrderBy == 1)
    {
        strOrder = "SaleNum desc,Sort desc,AddTime desc";
    }
    else if (OrderBy == 2)
    {
        strOrder = "SalPrice,Sort desc,AddTime desc";
    }

    Model.PageData<Model.Product> data = new BLL.Product().GetList(20, base.PageIndex, "", where, strOrder);
    repList.DataSource = data.DataSoure;
    repList.DataBind();
    pgServer.RecordCount = data.Count;
    pgServer.UrlRewritePattern = getUrl("1", "1").Replace("#pro-list", "") + "&page={0}#pro-list";
    pgServer.PageSize = 20;
    AllCount = data.Count;
    AllPage = data.PageCount;
    ThisPage = base.PageIndex;
    if (ThisPage < 1)
    {
        ThisPage = 1;
    }
    if (AllPage == 0)
    {
        ThisPage = 0;
    }
    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("?") >= 0)
    {
        string index = url.Remove(0, url.IndexOf("?") + 1);
        string para = index.Replace("?", "");
        //切割成一个一个的参数并转换成SQL语句
        string[] ps = para.Split(‘&‘);
        string sql = "";
        for (int i = 0; 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[1].ToString());
                //c为属性内容的编号,根据程序自己做判断
            }
        }
    }
    return value;
}
时间: 2024-10-27 00:51:46

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

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

这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第三篇:排序.筛选和分页 原文:Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application 译文版权所有,谢绝全文转载--但你可以在你的网站上添加到该教程的链接. 在之前的教程中你实现了一组使用Web页面

排序、筛选、分页以及分组

Sorting, filtering, paging, and grouping¶ 7 of 8 people found this helpful By Tom Dykstra The Contoso University sample web application demonstrates how to create ASP.NET Core 1.0 MVC web applications using Entity Framework Core 1.0 and Visual Studio

asp.net GridView 表格之分页显示与翻页功能及自定义翻页页码样式

一.实现分页功能  GridView实现分页只需要在属性框中将AllowPaging(是否在GridView中打开分页功能)设置为true即可 有时打开分页后不显示页码 确保AllowCustomPaging(是否打开对自定义分页的支持)为False即可 二.实现翻页功能  如何点击页码实现翻页呢? 在属性框中事件选择设置PageIndexChanging(在Grid View的当前索引页正在更改事触发)这一事件 后台代码如下 /// <summary> /// 翻页操作 /// 在GridV

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

(原文) 昨天在ASP.NET MVC利用PagedList分页(一)的 最后一节提到,一个好的用户体验绝对不可能是点击下一页后刷新页面,所以今天来说说利用Ajax+PagedList实现无刷新(个人绝对局部刷新更准确 些)的分页.其实在PagedList.Mvc中早已经为我们提供好了Ajax分页的各种东东,但是这里我要自己写下. 实现思想: 1.客户端发送Ajax请求.2.服务器端响应请求并将响应结果回传给客户端.3.客户端接收响应结果并进行数据绑定. 实现方案: 大多数人都知道这个思想,但是

MVC5 Entity Framework学习之添加排序、筛选和分页功能

前一篇文章中实现了对Student 实体的的基本CRUD操作,在这篇文章中将演示如何为Students Index页面添加排序.筛选和分页的功能. 下面是当完成排序.筛选和分页功能后的截图,你可以点击列标题来进行排序. 1.为 Students Index页面添加列排序链接 要为Students Index页面添加排序功能,你需要修改Student controller的Index方法,并为Student Index视图添加代码. 向Index方法添加排序功能 打开Controllers\Stu

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

在前面的教程你实施了一套基本的 CRUD 操作,为Student实体的 web 页.在本教程中,您将添加排序. 筛选和分页到 StudentsIndex的功能.您还将创建一个页面,并简单分组. 下面的插图显示页面当你完成时的样子.列标题是链接,用户可以单击要作为排序依据的列.单击列标题,一再升序和降序之间切换. 将列排序链接添加到学生索引页 若要添加排序到学生索引页,会改变Student控制器的Index方法,将代码添加到Student的索引视图. 添加排序功能指数法 在Controllers\

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

一.前言 下面我们将开始学习模型绑定,通过下面的知识我们将能够理解ASP.NET MVC模型的模型绑定器是如何将http请求中的数据转换成模型的,其中我们重点讲述的是表单数据. 二.正文 1.简单类型绑定 学过一定ASP.NET MVC都会为这个特点所骄傲,就是能够将表单中与同名的参数映射,这相比操作ASP.NET控件来获取值轻便了许多,但是正如上面所说的那样要同名(大小写不区分),下面我们会讲述如何自己去指定. 首先我们在HomeController(如果不存在则创建)中获取表单中的值并显示:

ASP.NET MVC 简单的分页思想与实现

, 作为一个程序猿,数据分页是每个人都会遇到的问题.解决方案更是琳琅满目,花样百出.但基本的思想都是差不多的. 下面给大家分享一个简单的分页器,让初学者了解一下最简单的分页思想,以及在ASP.NET MVC中的简单实现与应用. 一,定义分页器类 在ASP.net MVC中,分页的数据源可能是各种不同的类型,所以最好使用泛型来定义. public class PagingHelper<T> 二,基本三要素 实现分页人所共知的三个基本属性: DataSource:数据源,要知道数据源共计多少条数据

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

前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用到了,你再去看理论性的文章时才会豁然开朗,这是我一直以来学习技术的方法.本文我们来讲解.NET Core中的模型绑定. 话题 在ASP.NET Core之前MVC和Web APi被分开,也就说其请求管道是独立的,而在ASP.NET Core中,WebAPi和MVC的请求管道被合并在一起,当我们建立控