private static TDictionary GetDictionary <TDictionary>(object obj, IPagerOption option) where TDictionary : IDictionary <string, object>, new()
        {
            var t = new TDictionary();

            foreach (var item in obj.GetType().GetProperties())
            {
                var value = item.GetValue(obj, null);
                if (value == null)
                {
                    continue;
                }
                var name = item.Name;
                switch (option.ParamNameFormat.ToLower())
                {
                case "lower":
                    name = name.ToLower();
                    break;

                case "upper":
                    name = name.ToUpper();
                    break;
                }
                t.Add(name, value);
            }
            return(t);
        }
        /// <summary>
        /// 分页方法
        /// </summary>
        /// <param name="html"></param>
        /// <param name="routeValues">使用的路由的值</param>
        /// <param name="option">分页选项</param>
        /// <returns></returns>
        public static HtmlString Pager(this IHtmlHelper html, object routeValues, IPagerOption option)
        {
            var routeValue = new RouteValueDictionary();

            if (routeValues != null)
            {
                routeValue = GetDictionary <RouteValueDictionary>(routeValues, option);
            }
            return(html.Pager(option.RouteName, routeValue, option));
        }
        /// <summary>
        /// 分页方法
        /// </summary>
        /// <param name="html"></param>
        /// <param name="routeName">使用的路由名称</param>
        /// <param name="routeValues">使用的路由的值</param>
        /// <param name="option">分页选项</param>
        /// <returns></returns>
        public static HtmlString Pager(this IHtmlHelper html, string routeName, RouteValueDictionary routeValues, IPagerOption option)
        {
            //初始化
            var routeData = html.ViewContext.RouteData;

            if (routeData == null)
            {
                return(HtmlString.Empty);
            }
            var url = new UrlHelper(new ActionContext(html.ViewContext.HttpContext, routeData, html.ViewContext.ActionDescriptor));

            if (routeValues == null)
            {
                routeValues = new RouteValueDictionary();
            }
            //计算分页信息
            var pageCount = option.DataCount / option.PageSize;

            if (option.DataCount % option.PageSize != 0)
            {
                pageCount += 1;
            }
            var strs = new StringBuilder();

            if (option.PageIndex < 1)
            {
                option.PageIndex = 1;
            }
            else if (option.PageIndex > pageCount)
            {
                option.PageIndex = pageCount;
            }
            if (pageCount <= 1)
            {
                return(HtmlString.Empty);
            }
            strs.AppendFormat("<ul class='{0}'>", option.PagerClassName);
            if (option.ShowDataCount)
            {
                strs.AppendFormat("<li><span class='{1}'>{0}</span></li>", string.Format(option.DataCountTextFormat, option.DataCount), option.PagerStatusClassName);
            }
            //添加分页状态
            if (option.ShowPagerStatus)
            {
                strs.AppendFormat("<li><span class='{0}'>{1}</span></li>", option.PagerStatusClassName, string.Format(option.PagerStatusTextFormat, option.PageIndex, pageCount));
            }
            //判断路由值中是否包含页码参数,不存在就添加
            if (routeValues.ContainsKey(option.PageIndexParamName))
            {
                routeValues[option.PageIndexParamName] = 1;
            }
            else
            {
                routeValues.Add(option.PageIndexParamName, 1);
            }
            //添加首页按钮
            if (option.ShowFirstLastPageButton)
            {
                if (option.PageIndex != 1)
                {
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", url.RouteUrl(routeName, routeValues), option.FirstPageButtonText, option.FirstPageButtonClassName);
                }
                else
                {
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", "javascript:void(0)", option.FirstPageButtonText, option.FirstPageButtonClassName);
                }
            }
            //计算按钮分组
            int btnGroupNum = pageCount / option.PageButtonCount;//按钮分组的个数

            if (pageCount % option.PageButtonCount != 0)
            {
                btnGroupNum += 1;
            }
            int btnGroupIndex = option.PageIndex / option.PageButtonCount;//当前按钮分组的索引

            if (option.PageIndex % option.PageButtonCount != 0)
            {
                btnGroupIndex += 1;
            }
            //添加上一组按钮
            if (option.ShowPreNextGroupButton)
            {
                if (btnGroupIndex > 1)
                {
                    int preGroupIndex    = btnGroupIndex - 1;
                    int preGroupBtnStart = preGroupIndex * option.PageButtonCount;
                    routeValues[option.PageIndexParamName] = preGroupBtnStart;
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", url.RouteUrl(routeName, routeValues), option.PreGroupButtonText, option.PreGroupButtonClassName);
                }
                else
                {
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", "javascript:void(0)", option.PreGroupButtonText, option.PreGroupButtonClassName);
                }
            }
            //添加上一页按钮
            if (option.ShowPreNextPageButton)
            {
                if (option.PageIndex > 1)
                {
                    routeValues[option.PageIndexParamName] = option.PageIndex > 1 ? option.PageIndex - 1 : option.PageIndex;
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", url.RouteUrl(routeName, routeValues), option.PrePageButtonText, option.PrePageButtonClassName);
                }
                else
                {
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", "javascript:void(0)", option.PrePageButtonText, option.PrePageButtonClassName);
                }
            }

            //添加数字按钮
            var btnStart = option.PageIndex - option.PageButtonCount / 2;

            if (btnStart <= 0)
            {
                btnStart = 1;
            }
            if (!option.CurrentPageInCenter)
            {
                btnStart = ((btnGroupIndex - 1) * option.PageButtonCount) + 1;
            }
            var btnEnd = btnStart + option.PageButtonCount;

            for (int i = btnStart; i < btnEnd; i++)
            {
                if (i <= pageCount)
                {
                    routeValues[option.PageIndexParamName] = i;
                    if (i == option.PageIndex)
                    {
                        strs.AppendFormat("<li class='{2}'><a href='{0}' class='{2}'>{1}</a></li>", url.RouteUrl(routeName, routeValues), i, option.CurrentPageClassName);
                    }
                    else
                    {
                        strs.AppendFormat("<li><a href='{0}'>{1}</a></li>", url.RouteUrl(routeName, routeValues), i);
                    }
                }
            }

            //添加下一页按钮
            if (option.ShowPreNextPageButton)
            {
                if (option.PageIndex < pageCount)
                {
                    routeValues[option.PageIndexParamName] = option.PageIndex + 1 > pageCount ? pageCount : option.PageIndex + 1;
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", url.RouteUrl(routeName, routeValues), option.NextPageButtonText, option.NextPageButtonClassName);
                }
                else
                {
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", "javascript:void(0)", option.NextPageButtonText, option.NextPageButtonClassName);
                }
            }
            //添加下一组按钮
            if (option.ShowPreNextGroupButton)
            {
                if (btnGroupIndex < btnGroupNum)
                {
                    int nextGroupIndex    = btnGroupIndex + 1;
                    int nextGroupBtnStart = ((nextGroupIndex - 1) * option.PageButtonCount) + 1;
                    routeValues[option.PageIndexParamName] = nextGroupBtnStart;
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", url.RouteUrl(routeName, routeValues), option.NextGroupButtonText, option.NextGroupButtonClassName);
                }
                else
                {
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", "javascript:void(0)", option.NextGroupButtonText, option.NextGroupButtonClassName);
                }
            }
            //添加尾页按钮
            if (option.ShowFirstLastPageButton)
            {
                if (option.PageIndex < pageCount)
                {
                    routeValues[option.PageIndexParamName] = pageCount;
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", url.RouteUrl(routeName, routeValues), option.LastPageButtonText, option.LastPageButtonClassName);
                }
                else
                {
                    strs.AppendFormat("<li><a class='{2}' href='{0}'>{1}</a></li>", "javascript:void(0)", option.LastPageButtonText, option.LastPageButtonClassName);
                }
            }
            //添加跳转区域
            if (option.ShowGotoPanel)
            {
                var    txtId    = Guid.NewGuid().ToString();
                string funcName = "func_" + Guid.NewGuid().ToString().Replace("-", "");
                strs.AppendFormat("<li><input type='text' class='{0}' id='{1}'/>", option.GotoPageInputClassName, txtId);
                strs.AppendFormat("<a class='{0}' href='javascript:{2}();'>{1}</a></li>", option.GotoPageButtonClassName, option.GotoPageBtuttonText, funcName);
                string js = @"<script type='text/javascript'>
                                        function funcName()
                                        {
                                          var pageIndex=document.getElementById('{0}').value;
                                          if(pageIndex.length==0 || !/[1-9][0-9]*/.test(pageIndex))return;
                                          var url=location.toString().toLowerCase();
                                          if (url.indexOf('{1}')<0) {
                                                if (url.indexOf('?')<0) {
                                                    url+='?{1}='+pageIndex;
                                                }
                                                else {
                                                    url+='&{1}='+pageIndex;
                                                }
                                          }
                                          else
                                          {
                                            var reg=/{1}=-?[0-9]+/;
                                            url=url.replace(reg,'{1}='+pageIndex);
                                          }
                                           location=url;
                                        }
                                        </script>";
                js = js.Replace("funcName", funcName).Replace("{0}", txtId).Replace("{1}", option.PageIndexParamName.ToLower());
                strs.Append(js);
            }
            //结束
            strs.Append("</ul>");
            return(new HtmlString(strs.ToString()));
        }
        /// <summary>
        /// 分页方法
        /// </summary>
        /// <param name="html"></param>
        /// <param name="routeName">使用的路由名称</param>
        /// /// <param name="option">分页选项</param>
        /// <returns></returns>
        public static HtmlString Pager(this IHtmlHelper html, string routeName, IPagerOption option)
        {
            var routeValue = new RouteValueDictionary();

            return(html.Pager(routeName, routeValue, option));
        }
Exemple #5
0
 public PagerController(IPagerOption pagerOption)
 {
     PagerOption = pagerOption;
 }