c# - 编写分页的通用方法

标签 c# asp.net-mvc

我有用于计算分页的 Controller 。但是我有 13 个不同的 Controller 。因此,在每个 Controller 中编写该计算将是乏味的。

这是完整的方法:

 [Route("sort/{SortColumn}/{SortOrder?}", Name = "Sort-Product")]
        [Route("page/{Page:int}/{SortColumn}/{SortOrder?}", Name = "Paging-Product")]
        [Route("search/{SearchString}")]
        [Route("index")]
        public ActionResult Index(string searchString, string filter, string currentFilter, string sortColumn, string sortOrder, int? page)
        {
            IOrderedQueryable<Product> entities = (IOrderedQueryable<Product>)db.FilteredProducts;

            if (searchString != null) page = 1; else searchString = currentFilter;

            if (filter != null) {
                string[] filters = filter.Split(new char[] { '.' });
                filter = "";

                // filter on form
                if (filters.Length > 0 && !String.IsNullOrEmpty(filters[0])) {
                    FormLibraryEntry formEntry = FormLibraryController.GetFormLibraryEntry(filters[0], StateHelper.GetSchema());

                    if (formEntry != null) {
                        entities = (IOrderedQueryable<Product>)entities.Where(
                            s => s.FormName == formEntry.Id
                        );
                        AddFixedNotification(String.Format(Resources.Entity.Environment.FilteredByFormMessage, formEntry.Name));
                        filter += filters[0];
                    }
                }

                // filter on design template
                if (filters.Length > 1 && !String.IsNullOrEmpty(filters[1])) {
                    var designEntry = DesignTemplateController.GetTemplateLibraryEntry(filters[1], StateHelper.GetSchema());

                    if (designEntry != null) {
                        entities = (IOrderedQueryable<Product>)entities.Where(
                            s => s.TemplateName == designEntry.Id
                        );
                        AddFixedNotification(String.Format(Resources.Entity.Environment.FilteredByDesignTemplateMessage, designEntry.Name));
                        filter += "." + filters[1];
                    }

                }
            }

            if (!String.IsNullOrEmpty(searchString)) {
                entities = (IOrderedQueryable<Product>)entities.Where(
                        s => s.Name.ToUpper().Contains(searchString.ToUpper())
                        || (!String.IsNullOrEmpty(s.FormName) && s.FormName.ToUpper().Contains(searchString.ToUpper()))
                        || (!String.IsNullOrEmpty(s.UrlName) && s.UrlName.ToUpper().Contains(searchString.ToUpper()))
                );
                AddFixedNotification(String.Format(Resources.Entity.Environment.FilteredBySearchTermMessage, searchString));
            }

            switch (sortColumn) {
                case "id":
                    entities = (sortOrder == "desc") ? entities.OrderByDescending(s => s.Id) : entities.OrderBy(s => s.Id);
                    break;
                case "name":
                    entities = (sortOrder == "desc") ? entities.OrderByDescending(s => s.Name) : entities.OrderBy(s => s.Name);
                    break;
                case "enabled":
                    entities = (sortOrder == "desc") ? entities.OrderByDescending(s => s.IsEnabled) : entities.OrderBy(s => s.IsEnabled);
                    break;
                case "formname":
                    entities = (sortOrder == "desc") ? entities.OrderByDescending(s => s.FormName) : entities.OrderBy(s => s.FormName);
                    break;
                case "design":
                    entities = (sortOrder == "desc") ? entities.OrderByDescending(s => s.TemplateName) : entities.OrderBy(s => s.TemplateName);
                    break;
                case "urlname":
                    entities = (sortOrder == "desc") ? entities.OrderByDescending(s => s.UrlName) : entities.OrderBy(s => s.UrlName);
                    break;
                case "forms":
                    entities = (sortOrder == "desc") ? entities.OrderByDescending(s => s.SubmittedForms.Count()) : entities.OrderBy(s => s.SubmittedForms.Count());
                    break;
                case "modified":
                    entities = (sortOrder == "desc") ? entities.OrderByDescending(s => s.ModificationDate) : entities.OrderBy(s => s.ModificationDate);
                    break;
                default:
                    sortColumn = "name";
                    sortOrder = "";
                    entities = (sortOrder == "desc") ? entities.OrderByDescending(s => s.Name) : entities.OrderBy(s => s.Name);
                    break;
            }

            ViewBag.SortColumn = sortColumn;
            ViewBag.SortOrder = sortOrder == "desc" ? "desc" : "";
            ViewBag.SearchString = searchString;
            ViewBag.Filter = filter;

            int pageSize = StateHelper.GetPageSize();
            int pageNumber = StateHelper.HasPageSizeChanged ? 1 : (page ?? 1);


            object selectionProduct = ModelHelper.GetSelectedModelId("Product");
            if (selectionProduct != null) {
                IEnumerable<IEnumerable<Product>> pp = entities.Partition(pageSize);
                int calculatedPage = 0;
                bool found = false;
                foreach (var item in pp) {
                    calculatedPage++;
                    IEnumerable<Product> inner = item as IEnumerable<Product>;
                    foreach (var product in inner) {
                        if (product.Id == (int)selectionProduct) {
                            found = true;
                            ViewBag.selectedRowProduct = product.Id;
                            break;
                        }
                    }
                    if (found)
                        break;
                }
                if (found)
                    pageNumber = calculatedPage;

            }

            return View(entities.ToPagedList(pageNumber, pageSize));
        }

但这是计算的部分:

object selectionProduct = ModelHelper.GetSelectedModelId("Product");
            if (selectionProduct != null) {
                IEnumerable<IEnumerable<Product>> pp = entities.Partition(pageSize);
                int calculatedPage = 0;
                bool found = false;
                foreach (var item in pp) {
                    calculatedPage++;
                    IEnumerable<Product> inner = item as IEnumerable<Product>;
                    foreach (var product in inner) {
                        if (product.Id == (int)selectionProduct) {
                            found = true;
                            ViewBag.selectedRowProduct = product.Id;
                            break;
                        }
                    }
                    if (found)
                        break;
                }
                if (found)
                    pageNumber = calculatedPage;

            }

所以我尝试构建这样的辅助方法:

 public static bool FindPage(Type T, object modelId, IEnumerable<Type> entities, int pageSize, int calculatedPage, int? id)
        {
            if (modelId != null) {
                calculatedPage = 0;
                IEnumerable<IEnumerable<T>> pp = entities.Partition(pageSize);
                int page = 0;
                bool found = false;
                foreach (var item in pp) {
                    page++;
                    IEnumerable<Type> inner = item as IEnumerable<Type>;
                    foreach (var product in inner) {
                        if (id == (int)modelId) {
                            found = true;
                            break;
                        }
                    }
                    if (found)
                        break;
                }
                if (found)
                    calculatedPage = page;
                else
                    calculatedPage = 0;

                return found;
            }
            return false;
        }

但是我得到这个错误:

The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?) 

谢谢

最佳答案

尝试:

public static bool FindPage<T>(object modelId, IEnumerable<T> entities, int pageSize, int calculatedPage, int? id)
    {
        if (modelId != null) {
            calculatedPage = 0;
            IEnumerable<IEnumerable<T>> pp = entities.Partition(pageSize);
            int page = 0;
            bool found = false;
            foreach (var item in pp) {
                page++;
                IEnumerable<T> inner = item as IEnumerable<T>;
                foreach (var product in inner) {
                    if (id == (int)modelId) {
                        found = true;
                        break;
                    }
                }
                if (found)
                    break;
            }
            if (found)
                calculatedPage = page;
            else
                calculatedPage = 0;

            return found;
        }
        return false;
    }

关于c# - 编写分页的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31399889/

相关文章:

c# - MVC - 字符串或二进制数据将被截断。\r\n语句已终止

c# - 如何在根类中创建一些由所有派生类共享的字典?

asp.net-mvc - 站点地图 HtmlHelper ASP.NET MVC

javascript - 提交后 Controller 中的 formCollection 为空

asp.net-mvc - asp.net mvc多参数请求动态图片?

regex - 使用电子邮件地址作为用户名的正则表达式?

从具有属性的构造函数调用 C# 延迟方法(可能是惰性求值)

c# - 如何在 C# 中自动化后关闭 Outlook

c# - 如何在 C# 中捕获 SMB/CIFS 数据包?

c# - 如何删除点网核心输入模型中的多余空格?