新闻

当前位置:手机版美高梅网站 > 新闻 > DataList的一次分页困惑,NHibernate封装代码

DataList的一次分页困惑,NHibernate封装代码

来源:http://www.best-sclae.com 作者:手机版美高梅网站 时间:2019-12-23 08:56

直白不掌握该怎样给未有放手分页的DataLiat举办分页,网上提供的分页算法大致两种,生机勃勃种是透过数据库分页,另豆蔻梢头种是因此PageDataSource,数据库的分页是必定飞快的,可是自身还不曾学会,何况接收sql2003和sql二〇〇七的数据库分页方法是差别的,而自己利用的是sql2002,未有内置的分页函数。通PageDataSource分页的点子非常多,不过有有个别要求,那就是DataSource必得是DataSet的Row,而本人上学应用的3层用的是重回泛型接口IList<>,我并没有好的消除办法,在博问上50分悬赏也绝非人应对,很吸引,明日找到ScottMitchell的asp.net2.0数量教程,因为3层构造本人是看了前3章才入的门。第三十八章是专程讲DataList和Repeater数据分页的,个中有段代码给了作者超级大的启示:

作为二个工程师,数据分页是每种人都会遇上的标题。应用方案特别绚丽多彩,无奇不有。但大旨的出主意都以大半的。

      NHibernate已经化为.net主流的ORM框架,当然,在付出中风度翩翩旦急需接受NHibernate的话,大家常常会对他展开贰遍封装,以便在类型中央银行使更利于,以致对NHibernate有一个大局的主宰。而对NHibernate的卷入亦非那么轻易的,譬喻说NHibernate不能够做到夸层的卷入,意思就是在其余层使用封装的代码的时候,也是急需援用NHibernate的,举个例子经常的IQuery条件查询,纵然供给排序也许动态条件的话,就须要传递ICriterion到调用层进行设置,当然如果是hql可以利用拼接的秘籍,但不引入这种拼接的议程在UI层使用,这样跟sql未有啥样差距。

 

  上边给大家共享贰个轻易的分页器,让初我们理解一下最简易的分页思想,以致在ASP.NET MVC中的简单达成与行使。

上面代码是自小编在学习的项目中动用的一些打包,当然未有通过严谨的测验,如有bug请报告。

手机版美高梅网站 1手机版美高梅网站 2Code
[System.ComponentModel.DataObjectMethodAttribute
            (System.ComponentModel.DataObjectMethodType.Select, false)]
            public PagedDataSource GetProductsAsPagedDataSource(int pageIndex, int pageSize)
            {
            // Get ALL of the products
            Northwind.ProductsDataTable products = GetProducts();
            // Limit the results through a PagedDataSource
            PagedDataSource pagedData = new PagedDataSource();
            pagedData.DataSource = products.Rows;
            pagedData.AllowPaging = true;
            pagedData.CurrentPageIndex = pageIndex;
            pagedData.PageSize = pageSize;
            return pagedData;
            }

大器晚成,定义分页器类

 

“获得全体产品,然后经过PagedDataSource进行结果限定”

  在ASP.NET MVC中,分页的数据源也许是种种区别的档期的顺序,所以最佳利用泛型来定义。

 首先是对NHibernate的SessionFactory的卷入,那几个就大约了

作者透过泛型获得的也是独具结果,那么是或不是足以筛选结果获得自己所急需的啊?

public class PagingHelper<T>

 

于是乎有了下边的代码:

二,基本三要素

 

 

  完毕分页赫赫有名的八个着力属性:

手机版美高梅网站 3手机版美高梅网站 4View Code

手机版美高梅网站 5手机版美高梅网站 6Code
    public IList<Article> PageDataListBind(string type,int minPage,int PageSize)
        {
            //得到同类型的有着消息
            IList<Article> page = new List<Article>();
            IList<Article> articles = new List<Article>();
            articles = this.GetArticleTitleByType(type);
            int count = minPage + PageSize;
            if(count>=articles.Count)
            {
                count = articles.Count;
            }
            //通过参数分页
            for (int i = minPage; i <= count; i++)
            {
                page.Add(articles[i]);
            }
            return page;
        }

DataSource:数据源,要通晓数据源共计多少条数据,会相应五个数据源的方法-Count(卡塔尔国,

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Web;
 6 using NHibernate;
 7 using NHibernate.Cfg;
 8 using System.Collections;
 9 
10 namespace LBC.Permission.DAL
11 {
12 
13     public class NHSessionFactory
14     {
15         private static readonly object lockObj = new object();
16         private static NHSessionFactory instance = null;
17         private static ISessionFactory factory;
18 
19         private NHSessionFactory() { }
20 
21         public static NHSessionFactory Instance
22         {
23             get
24             {
25                 if (instance == null)
26                 {
27                     lock (lockObj)
28                     {
29                         if (instance == null)
30                         {
31                             instance = new NHSessionFactory();
32                             Configuration cfg = new Configuration();
33                             factory = cfg.Configure().BuildSessionFactory();
34                         }
35                     }
36                 }
37                 return instance;
38             }
39         }
40 
41         public ISession GetCurrentSession()
42         {
43             return factory.GetCurrentSession();
44         }
45 
46         public ISession OpenSession()
47         {
48             return factory.OpenSession();
49         }
50 
51         public ISessionFactory SessionFactory
52         {
53             get
54             {
55                 return factory;
56             }
57         }
58 
59     }
60 }

结果是足以的,通过设置ObjectDataSource的筛选参数,进行分页设置。

PageSize:来陈说每页彰显的笔录的条数。

 

固然达到了急需,可是有比很大的浪费。希望博友能帮小编想一想更加好的方式

PageIndex:当前页的索引值,平常第生龙活虎页的索引值为0,当然为了表示方便,能够从1从头,同一时候后边默以为从1最早。

然后是对常用方法的包裹

 

//分页数据源
public IEnumerable<T> DataSource { get;private set; }
//每页突显记录的数码
public int PageSize { get; private set; }
//当前页数
public int PageIndex { get; set; }

 

三,扩展属性

手机版美高梅网站 7手机版美高梅网站 8View Code

  有了上述三要素,大家可以想见其余多少个举足轻重性质

 1 public partial class DataAccess
 2     {
 3         private ISession session;
 4 
 5         public DataAccess()
 6         {
 7             session = NHSessionFactory.Instance.GetCurrentSession();
 8         }
 9 
10         #region Transaction
11 
12         public void Transaction(Action action)
13         {
14             ITransaction transaction = session.BeginTransaction();
15             try
16             {
17                 action();
18                 transaction.Commit();
19             }
20             catch
21             {
22                 transaction.Rollback();
23                 throw;
24             }
25         }
26 
27         public void Transaction(Action action, System.Data.IsolationLevel isolationLevel)
28         {
29             ITransaction transaction = session.BeginTransaction(isolationLevel);
30             try
31             {
32                 action();
33                 transaction.Commit();
34             }
35             catch
36             {
37                 transaction.Rollback();
38                 throw;
39             }
40         }
41 
42         #endregion
43     }

PageCount:总页数,其值取大于或等于 DataSource.Count/PageSize 的矮小整数,举例5.2页,其实正是6页。

 

HasPrev:用来剖断是不是有上黄金年代页,借使索引 PageIndex 从1开头,那就是剖断PageIndex > 1 是否创建。

主干的增加和删除改操作

HasNext:用力剖断是或不是有下生龙活虎页,假设索引 PageIndex 从1初叶,需剖断PageIndex < PageCount 是不是创建。

 

//分页总页数
public int PageCount { get;private set; }
//是或不是有前生龙活虎页
public bool HasPrev { get { return PageIndex > 1; } }
//是或不是有下大器晚成页
public bool HasNext { get { return PageIndex < PageCount; } }

手机版美高梅网站 9手机版美高梅网站 10View Code

四,宗旨措施

  1 public partial class DataAccess
  2     {
  3         public T Get<T>(object id)
  4         {
  5             return session.Get<T>(id);
  6         }
  7 
  8         public T Load<T>(object id)
  9         {
 10             return session.Load<T>(id);
 11         }
 12 
 13         public void Insert(object obj)
 14         {
 15             session.Save(obj);
 16             session.Flush();
 17         }
 18 
 19         public void Update(object obj)
 20         {
 21             session.Update(obj);
 22             session.Flush();
 23         }
 24 
 25         public void InsertOrUpdate(object obj)
 26         {
 27             session.SaveOrUpdate(obj);
 28             session.Flush();
 29         }
 30 
 31         #region Delete
 32 
 33         /// <summary>
 34         /// 依据实体对象删除
 35         /// </summary>
 36         /// <param name="obj">实体对象</param>
 37         public void Delete(object obj)
 38         {
 39             session.Delete(obj);
 40             session.Flush();
 41         }
 42 
 43         /// <summary>
 44         /// 依照hql语句删除
 45         /// <example>
 46         /// hql="from 类名 where 属性名=值"
 47         /// </example>
 48         /// </summary>
 49         /// <param name="hql">hql语句</param>
 50         public void DeleteByQuery(string hql)
 51         {
 52             session.Delete(hql);
 53             session.Flush();
 54         }
 55 
 56         /// <summary>
 57         /// 依照Query进行删减
 58         /// <example>
 59         /// hql="delete from 类名 where 属性名=:参数名";
 60         /// </example>
 61         /// </summary>
 62         /// <param name="hql">hql语句</param>
 63         /// <param name="name">参数名称</param>
 64         /// <param name="value">参数值</param>
 65         public void DeleteByQuery(string hql, string name, object value)
 66         {
 67             DeleteByQuery(hql, new string[] { name }, new object[] { value });
 68         }
 69 
 70         /// <summary>
 71         /// 根据Query举行删除
 72         /// <example>
 73         /// hql="delete from 类名 where 属性名=:参数名";
 74         /// </example>
 75         /// </summary>
 76         /// <param name="hql">hql语句</param>
 77         /// <param name="names">参数名称数组</param>
 78         /// <param name="values">参数值数组</param>
 79         public void DeleteByQuery(string hql, string[] names, object[] values)
 80         {
 81             IQuery query = session.CreateQuery(hql);
 82             for (int i = 0; i < names.Length; i++)
 83             {
 84                 query.SetParameter(names[i], values[i]);
 85             }
 86             query.ExecuteUpdate();
 87             session.Flush();
 88         }
 89 
 90         /// <summary>
 91         /// 依据Query进行删除
 92         /// <example>
 93         /// hql="delete from 类名 where 属性名=? and 属性名=?";
 94         /// </example>
 95         /// </summary>
 96         /// <param name="hql">hql语句</param>
 97         /// <param name="values">参数值数组</param>
 98         public void DeleteByQuery(string hql, object[] values)
 99         {
100             IQuery query = session.CreateQuery(hql);
101             for (int i = 0; i < values.Length; i++)
102             {
103                 query.SetParameter(i, values[i]);
104             }
105             query.ExecuteUpdate();
106             session.Flush();
107         }
108 
109         #endregion
110     }

  最后便是内需得以落成分页的中坚-获取分页数据的办法:

 

GetPagingData(卡塔尔(英语:State of Qatar):获取当页的数码,寻日常用的手法是跳过PageIndex*PageSize条记录,然后取PageSize条数据。

Count操作

  在.NET中有非常多措施能够兑现那蓬蓬勃勃经过,这里介绍2个最简单易行的:

 

  方法1,从类别的钦赐地点重返钦命数量的总是成分:

手机版美高梅网站 11手机版美高梅网站 12View Code

public static IEnumerable<TSource> Take<TSource>( this IList<TSource> list, int start, int count )
    {
      for ( int index = start; index < Math.Min( start + count, list.Count ); index++ )
      {
        yield return list[index];//yield关键字的用法我们可以参详别的文章
      }
    }

 1 public partial class DataAccess
 2     {
 3         #region Count
 4 
 5         public int Count<T>() where T : class
 6         {
 7             ICriteria criteria = session.CreateCriteria<T>();
 8             return Convert.ToInt32(criteria.SetProjection(Projections.RowCount()).UniqueResult());
 9         }
10 
11         public int Count<T>(ICriterion expression) where T : class
12         {
13             ICriteria criteria = session.CreateCriteria<T>();
14             if (expression != null)
15             {
16                 criteria.Add(expression);
17             }
18             return Convert.ToInt32(criteria.SetProjection(Projections.RowCount()).UniqueResult());
19         }
20 
21         #endregion
22     }

  那么我们的GetPagingData(卡塔尔国方法就要那样写:

 

//获取当前页数据
public IEnumerable<T> GetPagingData()
{
    return DataSource.ToList<T>().Take((PageIndex-1)×PageSize,PageSize);
}

 Scalar操作

  其实作者更倾向与第二种方法,正是接受IEnumerable<T>的增加方法:

 

Skip(int count卡塔尔:跳过种类中钦赐数量的因素,然后重返剩余的要素

手机版美高梅网站 13手机版美高梅网站 14View Code

Take(int count卡塔尔(قطر‎:从连串的最初重返钦命数量的连美成分。

 1 public partial class DataAccess
 2     {
 3         #region Scalar
 4 
 5         public object Scalar(string hql)
 6         {
 7             return session.CreateQuery(hql).UniqueResult();
 8         }
 9 
10         public object Scalar(string hql, params object[] values)
11         {
12             IQuery query = session.CreateQuery(hql);
13             for (int i = 0; i < values.Length; i++)
14             {
15                 query.SetParameter(i, values[i]);
16             }
17             return query.UniqueResult();
18         }
19 
20         public object Scalar(string hql, string name, object value)
21         {
22             return Scalar(hql, new string[] { name }, new object[] { value });
23         }
24 
25         public object Scalar(string hql, string[] names, object[] values)
26         {
27             IQuery query = session.CreateQuery(hql);
28             for (int i = 0; i < names.Length; i++)
29             {
30                 query.SetParameter(names[i], values[i]);
31             }
32             return query.UniqueResult();
33         }
34 
35 
36         public object Scalar(string hql, Action<IQuery> action)
37         {
38             IQuery query = session.CreateQuery(hql);
39             action(query);
40             return query.UniqueResult();
41         }
42 
43         #endregion
44     }

  那么我们的GetPagingData(卡塔尔(英语:State of Qatar)只须要这么写就完事:

 

//获取当前页数据
public IEnumerable<T> GetPagingData()
{
    return DataSource.Skip((PageIndex - 1) * PageSize).Take(PageSize);
}

ScalarBySQL操作

  那句代码就是跳过 PageIndex - 1卡塔尔国 * PageSize 条数据,再取 PageSize 条数据 ,刚刚巧即是大家需求的当前页的数目。

 

 五,布局函数

手机版美高梅网站 15手机版美高梅网站 16View Code

  实例化四个分页器的时候,大家供给对它举行开端化:

 1 public partial class DataAccess
 2     {
 3         #region ScalarBySQL
 4 
 5         public object ScalarBySQL(string sql)
 6         {
 7             return session.CreateSQLQuery(sql).UniqueResult();
 8         }
 9 
10         public object ScalarBySQL(string sql, params object[] values)
11         {
12             ISQLQuery query = session.CreateSQLQuery(sql);
13             for (int i = 0; i < values.Length; i++)
14             {
15                 query.SetParameter(i, values[i]);
16             }
17             return query.UniqueResult();
18         }
19 
20         public object ScalarBySQL(string sql, string name, object value)
21         {
22             return ScalarBySQL(sql, new string[] { name }, new object[] { value });
23         }
24 
25         public object ScalarBySQL(string sql, string[] names, object[] values)
26         {
27             ISQLQuery query = session.CreateSQLQuery(sql);
28             for (int i = 0; i < names.Length; i++)
29             {
30                 query.SetParameter(names[i], values[i]);
31             }
32             return query.UniqueResult();
33         }
34 
35         public object ScalarBySQL(string sql, Action<ISQLQuery> action)
36         {
37             ISQLQuery query = session.CreateSQLQuery(sql);
38             action(query);
39             return query.UniqueResult();
40         }
41 
42         #endregion
43     }

  public PagingHelper(int pageSize, IEnumerable<T> dataSource)
        {
            this.PageSize = pageSize > 1 ? pageSize : 1;
            this.DataSource = dataSource;
            PageCount = (int)Math.Ceiling(dataSource.Count() / (double)pageSize);
        }

 

  真正的利用中,你能够重写分页器类,依据你的急需来决定什么字段是只读的。比方你想每日变动页面成分的数目,那么你能够把PageSize设置为可读写的属性。

基本的Query操作

  至此,这些分页器我们就完工拉。

 

六,与ASP.NET MVC的简便组合

手机版美高梅网站 17手机版美高梅网站 18View Code

  首先我们经过VS制造二个空的基于Razor视图引擎的ASP.NET MVC3 Web应用程序,命名叫John康纳.Web

 1 public partial class DataAccess
 2     {
 3         #region Query
 4 
 5         public IList<T> Query<T>() where T : class
 6         {
 7             return session.CreateCriteria<T>().List<T>();
 8         }
 9 
10         public IList<T> Query<T>(Action<ICriteria> action) where T : class
11         {
12             ICriteria criteria = session.CreateCriteria<T>();
13             action(criteria);
14             return criteria.List<T>();
15         }
16 
17         public IList<T> Query<T>(ICriterion expression) where T : class
18         {
19             return Query<T>(expression, null);
20         }
21 
22         public IList<T> Query<T>(ICriterion expression, Action<ICriteria> action) where T : class
23         {
24             ICriteria criteria = session.CreateCriteria<T>();
25             if (expression != null)
26             {
27                 criteria.Add(expression);
28             }
29             if (action != null)
30             {
31                 action(criteria);
32             }
33             return criteria.List<T>();
34         }
35 
36         public IList<T> Query<T>(string hql)
37         {
38             return session.CreateQuery(hql).List<T>();
39         }
40 
41         public IList<T> Query<T>(string hql, params object[] values)
42         {
43             IQuery query = session.CreateQuery(hql);
44             for (int i = 0; i < values.Length; i++)
45             {
46                 query.SetParameter(i, values[i]);
47             }
48             return query.List<T>();
49         }
50 
51         public IList<T> Query<T>(string hql, string name, object value)
52         {
53             return Query<T>(hql, new string[] { name }, new object[] { value });
54         }
55 
56         public IList<T> Query<T>(string hql, string[] names, object[] values)
57         {
58             IQuery query = session.CreateQuery(hql);
59             for (int i = 0; i < names.Length; i++)
60             {
61                 query.SetParameter(names[i], values[i]);
62             }
63             return query.List<T>();
64         }
65 
66         public IList<T> Query<T>(string hql, Action<IQuery> action)
67         {
68             IQuery query = session.CreateQuery(hql);
69             action(query);
70             return query.List<T>();
71         }
72 
73         #endregion
74     }

  对创制进度或Razor不太理解的看官,请移步 ASP.NET MVC Razor视图引擎战术 <传送门> ,这里就不再赘言了。

 

  然后咱们需求张开以下几步

Page Query操作

  1,Models文件夹下,增添Student.cs文件,增添以下代码,为了演示方便这里模拟了贰个数据源,实际中的数据源或者来自数据库。

 

依傍数据源

手机版美高梅网站 19手机版美高梅网站 20View Code

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    public static class Students
    {
        public static IEnumerable<Student> data
        {
            get
            {
                return new List<Student>()
                {
                    new Student{ Id=0, Name="John"},
                    new Student{ Id=1, Name="Marry"},
                    new Student{ Id=2, Name="Andy"},
                    new Student{ Id=3, Name="Tom"},
                    new Student{ Id=4, Name="Lydia"},
                    new Student{ Id=5, Name="Chris"},
                    new Student{ Id=6, Name="Justin"},
                    new Student{ Id=7, Name="Susan"}
                };
            }
        }
    }

 1 public partial class DataAccess
 2     {
 3         #region Page Query
 4 
 5         public IList<T> Query<T>(int pageIndex, int pageSize, out int recordCount) where T : class
 6         {
 7             return Query<T>(null, null, pageIndex, pageSize, out recordCount);
 8         }
 9 
10         public IList<T> Query<T>(ICriterion expression, int pageIndex, int pageSize, out int recordCount) where T : class
11         {
12             return Query<T>(expression, null, pageIndex, pageSize, out recordCount);
13         }
14 
15         public IList<T> Query<T>(ICriterion expression, Order[] order,
16             int pageIndex, int pageSize, out int recordCount) where T : class
17         {
18             IList<T> list = new List<T>();
19             recordCount = 0;
20             ICriteria query = session.CreateCriteria<T>();
21             if (expression != null)
22             {
23                 query.Add(expression);
24             }
25             ICriteria queryPage = CriteriaTransformer.Clone(query);
26             //获取记录总量
27             recordCount = Convert.ToInt32(query.SetProjection(Projections.RowCount()).UniqueResult());
28 
29             //设置排序
30             if (order != null)
31             {
32                 foreach (Order o in order)
33                 {
34                     queryPage.AddOrder(o);
35                 }
36             }
37             queryPage.SetFirstResult((pageIndex - 1) * pageSize);
38             queryPage.SetMaxResults(pageSize);
39             list = queryPage.List<T>();
40 
41             return list;
42         }
43 
44         public IList<T> Query<T>(string hql, object[] values, int pageIndex, int pageSize)
45         {
46             IQuery query = session.CreateQuery(hql);
47             for (int i = 0; i < values.Length; i++)
48             {
49                 query.SetParameter(i, values[i]);
50             }
51             return query.SetFirstResult((pageIndex - 1) * pageSize).SetMaxResults(pageSize).List<T>();
52         }
53 
54         public IList<T> Query<T>(string hql, string name, object value, int pageIndex, int pageSize)
55         {
56             return Query<T>(hql, new string[] { name }, new object[] { value }, pageIndex, pageSize);
57         }
58 
59         public IList<T> Query<T>(string hql, string[] names, object[] values, int pageIndex, int pageSize)
60         {
61             IQuery query = session.CreateQuery(hql);
62             for (int i = 0; i < names.Length; i++)
63             {
64                 query.SetParameter(names[i], values[i]);
65             }
66             return query.SetFirstResult((pageIndex - 1) * pageSize).SetMaxResults(pageSize).List<T>();
67         }
68 
69         public IList<T> Query<T>(string hql, int pageIndex, int pageSize)
70         {
71             IQuery query = session.CreateQuery(hql);
72             return query.SetFirstResult((pageIndex - 1) * pageSize).SetMaxResults(pageSize).List<T>();
73         }
74 
75         #endregion
76     }

  2,Models文件夹下,加多PagingHelper.cs文件,增加大家上述分页器类。

 

分页器Code

SQL Query操作

public class PagingHelper<T>
    {
        //分页数据源
        public IEnumerable<T> DataSource { get; private set; }
        //每页展现记录的多寡
        public int PageSize { get; private set; }
        //当前页数
        public int PageIndex { get; set; }
        //分页总页数
        public int PageCount { get; private set; }

手机版美高梅网站 21手机版美高梅网站 22View Code

        //是还是不是有前生龙活虎页
        public bool HasPrev { get { return PageIndex > 1; } }
        //是或不是有下生龙活虎页
        public bool HasNext { get { return PageIndex < PageCount; } }
        //布局函数
        public PagingHelper(int pageSize, IEnumerable<T> dataSource)
        {
            this.PageSize = pageSize > 1 ? pageSize : 1;
            this.DataSource = dataSource;
            PageCount = (int)Math.Ceiling(dataSource.Count() / (double)pageSize);
        }
        //获取当前页数据
        public IEnumerable<T> GetPagingData()
        {
            return DataSource.Skip((PageIndex - 1) * PageSize).Take(PageSize);
        }
    }

 1 public partial class DataAccess
 2     {
 3         #region SQL Query
 4 
 5         public IList QueryBySQL(string sql)
 6         {
 7             return session.CreateSQLQuery(sql).List();
 8         }
 9 
10         public IList QueryBySQL(string sql, params object[] values)
11         {
12             ISQLQuery query = session.CreateSQLQuery(sql);
13             for (int i = 0; i < values.Length; i++)
14             {
15                 query.SetParameter(i, values[i]);
16             }
17             return query.List();
18         }
19 
20         public IList QueryBySQL(string sql, string name, object[] value)
21         {
22             return QueryBySQL(sql, new string[] { name }, new object[] { value });
23         }
24 
25         public IList QueryBySQL(string sql, string[] names, object[] values)
26         {
27             ISQLQuery query = session.CreateSQLQuery(sql);
28             for (int i = 0; i < names.Length; i++)
29             {
30                 query.SetParameter(names[i], values[i]);
31             }
32             return query.List();
33         }
34 
35         public IList QueryBySQL(string sql, Action<ISQLQuery> action)
36         {
37             ISQLQuery query = session.CreateSQLQuery(sql);
38             action(query);
39             return query.List();
40         }
41 
42         #endregion
43     }

  3,在Controller文件夹下增多调节器命名称叫HomeController,增加以下代码。

 

控制器Code

Page SQL Query操作

public class HomeController : Controller
    {
        public ActionResult Index(int pageIndex=1)
        {
            PagingHelper<Student> StudentPaging = new PagingHelper<Student>(2, Students.data卡塔尔国;//初阶化分页器
            StudentPaging.PageIndex = pageIndex;//钦点当前页
            return View(StudentPaging卡塔尔(英语:State of Qatar);//再次回到分页器实例到视图
        }
    }

 

  4,在View文件夹下加多Home文件夹,并新添视图像和文字件Index.cshtml,增多以下代码。

手机版美高梅网站 23手机版美高梅网站 24View Code

视图Code

 1 public partial class DataAccess
 2     {
 3         #region Page SQL Query
 4 
手机版美高梅网站, 5         public IList QueryBySQL(string sql, object[] values, int pageIndex, int pageSize)
 6         {
 7             ISQLQuery query = session.CreateSQLQuery(sql);
 8             for (int i = 0; i < values.Length; i++)
 9             {
10                 query.SetParameter(i, values[i]);
11             }
12             return query.SetFirstResult((pageIndex - 1) * pageSize).SetMaxResults(pageSize).List();
13         }
14 
15         public IList QueryBySQL(string sql, string name, object value, int pageIndex, int pageSize)
16         {
17             return QueryBySQL(sql, new string[] { name }, new object[] { value }, pageIndex, pageSize);
18         }
19 
20         public IList QueryBySQL(string sql, string[] names, object[] values, int pageIndex, int pageSize)
21         {
22             ISQLQuery query = session.CreateSQLQuery(sql);
23             for (int i = 0; i < names.Length; i++)
24             {
25                 query.SetParameter(names[i], values[i]);
26             }
27             return query.SetFirstResult((pageIndex - 1) * pageSize).SetMaxResults(pageSize).List();
28         }
29 
30         public IList QueryBySQL(string sql, int pageIndex, int pageSize)
31         {
32             ISQLQuery query = session.CreateSQLQuery(sql);
33             return query.SetFirstResult((pageIndex - 1) * pageSize).SetMaxResults(pageSize).List();
34         }
35 
36         #endregion
37     }

@using JohnConnor.Web.Models
@model PagingHelper<Student>
@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>
@foreach (var Data in Model.GetPagingData())
{
    <p>ID:@Data.Id Name:@Data.Name</p>
}
<p>
@if (Model.HasPrev)
{
    <a href="@Url.Action("Index", "Home", new { pageIndex = Model.PageIndex - 1 })">上一页</a>
}
else
{
    <em style="color:Gray">上一页</em>
}
@if (Model.HasNext)
{
    <a href="@Url.Action("Index", "Home", new { pageIndex = Model.PageIndex + 1 })">下一页</a>
}
else
{
      <em style="color:Gray">下一页</em>
}
</p>

 

  5,在Global.asax中构造路由,大家改进一下私下认可路由就足以了。

路由表配置

  public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{pageIndex}", // 带有参数的 U奇骏L
                new { controller = "Home", action = "Index", pageIndex = UrlParameter.Optional } // 参数暗中认可值
            );

        }

  今后保存之后F5周转,就能够看看八个大约的分页程序了。

  手机版美高梅网站 25

   UHighlanderL在开展了路由布署之后,也不会再是

  而成为了 那样的静态U大切诺基L,更简洁,更加赏心悦目。

本文由手机版美高梅网站发布于新闻,转载请注明出处:DataList的一次分页困惑,NHibernate封装代码

关键词:

上一篇:没有了

下一篇:回发或回调参数无效,系网开辟记