很多时候需要这样的功能,对表格进行分页、排序和检索。这个有很多实现的方式,有现成的表格控件、用前端的mvvm,用户控件。但很多时候看着很漂亮的东西你想进一步控制的时候却不那么如意。这里自己实现一次,功能不是高大全,但求一个清楚明白,也欢迎园友拍砖。前端是bootstrap3+jPaginate,后台基于membership。没什么难点。

    先上效果图。

    Asp.Net MVC  分页、检索、排序整体实现

 

    分页其实就是处理好 每页项目数、总项目数、总页数、当前页。为了方便复用,就先从仓库开始说起。

一、建立仓库

  1.定义Ipager接口,需要分页的模型仓库继承这个接口

namespace Protal.Model.Abstract
{
    /// <summary>
    /// 分页处理
    /// </summary>
   public interface IPager
    {
        /// <summary>
        /// 每页项目数
        /// </summary>
        /// <value>The page item count.</value>
      int  PageItemCount { get; set; }
      /// <summary>
      /// 总页数
      /// </summary>
      /// <value>The totoal page.</value>
       int TotoalPage { get; }
       /// <summary>
       /// 显示的页数
       /// </summary>
       /// <value>The display page.</value>
       int DisplayPage { get; set; }
       /// <summary>
       /// 满足条件的总数目
       /// </summary>
        int TotalItem { get; set; }
    }
}

2.定义IUsersRepository,主要处理User 相关的业务逻辑。Find函数是主要的查询方法,order表示顺反排序。

 public interface IUsersRepository : IPager
    {
        /// <summary>
        /// Post list
        /// </summary>
        /// <param name="order">Order expression</param>
        /// <param name="filter">Filter expression</param>
        /// <param name="skip">Records to skip</param>
        /// <param name="take">Records to take</param>
        /// <returns>List of users</returns>
        IEnumerable<User> Find(int order=0,string filter="", int skip = 0, int take = 10);
        /// <summary>
        /// Get single post
        /// </summary>
        /// <param name="name">User id</param>
        /// <returns>User object</returns>
        User FindByName(string name);
        /// <summary>
        /// Add new user
        /// </summary>
        /// <param name="user">Blog user</param>
        /// <returns>Saved user</returns>
        User Add(User user);
        /// <summary>
        /// Update user
        /// </summary>
        /// <param name="user">User to update</param>
        /// <returns>True on success</returns>
        bool Update(User user);
        /// <summary>
        /// Save user profile
        /// </summary>
        /// <param name="user">Blog user</param>
        /// <returns>True on success</returns>
        bool SaveProfile(User user);
        /// <summary>
        /// Delete user
        /// </summary>
        /// <param name="userName">User ID</param>
        /// <returns>True on success</returns>
        bool Remove(string userName);
    }

 

二、仓库的实现和绑定

  主要方法:Membership的中的User和我们自定义的不一样,所以存在一个转换

 public class UsersRepository : IUsersRepository
   {
       /// <summary>
       /// The _user list
       /// </summary>
        private List<User> _userList = new List<User>();
       /// <summary>
       /// The _page item count
       /// </summary>
        private int _pageItemCount;
        /// <summary>
        /// The _display page
        /// </summary>
        private int _displayPage;
        /// <summary>
        /// The _usercount
        /// </summary>
        private int _usercount;
        /// <summary>
        /// The _total item
        /// </summary>
        private int _totalItem;
        /// <summary>
        /// 标记是否有查询条件 没有的话则返回全部数目
        /// </summary>
        private Func<User, bool> _func;

        /// <summary>
        /// Gets or sets the users.
        /// </summary>
        /// <value>The users.</value>
        public List<User> Users
       {
           get
           {
               int count;
               var usercollection = Membership.GetAllUsers(0, 999, out count);
               if (count == _usercount) return _userList;
               _usercount = count;
               var members = usercollection.Cast<MembershipUser>().ToList();
               foreach (var membershipUser in members)//这里存在一个转换
               {
                   _userList.Add(new User
                   {
                       Email = membershipUser.Email,
                       UserName = membershipUser.UserName,
                       //roles password
                   });
               }
               return _userList;
           }
           set { _userList = value; }
       }

 

     
//查询
public IEnumerable<User> Find(int order = 0, string filter = "", int skip = 0, int take = 10) { if (take == 0) take = Users.Count;
//过滤 _func
= string.IsNullOrEmpty(filter) ? (Func<User, bool>) (n => n.UserName != "") : (n => n.UserName.Contains(filter)); var users = Users.Where(_func).ToList(); //更新总数目 _totalItem = users.Count; users = order == 0 ? users.OrderBy(n => n.UserName).ToList() : users.OrderByDescending(n => n.UserName).ToList(); return users.Skip(skip).Take(take); } /// <summary> /// 每页项目数 /// </summary> /// <value>The page item count.</value> public int PageItemCount { get { if (_pageItemCount == 0) { _pageItemCount = ProtalConfig.UserPageItemCount; } return _pageItemCount; } set { _pageItemCount = value; } } /// <summary> /// 总页数 /// </summary> /// <value>The totoal page.</value> public int TotoalPage { get { var page = (int) Math.Ceiling((double) TotalItem/PageItemCount); return page==0?1:page; } } /// <summary> /// 显示的页数 /// </summary> /// <value>The display page.</value> public int DisplayPage { get { if (_displayPage == 0) { _displayPage = ProtalConfig.UserDisplayPage; } return _displayPage; } set { _displayPage = value; } } /// <summary> /// 满足条件的总数目 保持更新 /// </summary> /// <value>The total item.</value> public int TotalItem { get { if (_func == null) _totalItem = Users.Count; return _totalItem; } set { _totalItem = value; } } }
ProtalConfig.UserDisplayPage 这里是通过配置实现一个默认页数,让用户可以再webconfig中更改行列的数目。
 public static int UserPageItemCount
                {
                    get
                    {
                        if (_userPageItemCount == 0)
                        {
                            _userPageItemCount = WebConfigurationManager.AppSettings["UserPageItemCount"] != null ?
                                Convert.ToInt16(WebConfigurationManager.AppSettings["UserPageItemCount"]) : 5;
                        }
                        return _userPageItemCount;
                    }
                    set
                    {
                        _userPageItemCount = value;
                    }
                }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-21
  • 2021-09-27
  • 2021-08-15
  • 2021-10-06
  • 2021-06-16
猜你喜欢
  • 2022-12-23
  • 2021-12-01
  • 2021-09-09
  • 2022-12-23
  • 2022-12-23
  • 2021-09-09
  • 2021-07-16
相关资源
相似解决方案