2015-07-14 36 views
6

Tôi có các bộ điều khiển để tính toán phân trang. Nhưng tôi có 13 bộ điều khiển khác nhau. Vì vậy, để viết rằng tính toán trong mỗi bộ điều khiển sẽ được tẻ nhạt.viết phương pháp chung để phân trang

này là phương pháp comoplete:

[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)); 
     } 

Nhưng đây là một phần của tính:

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; 

      } 

Vì vậy, tôi cố gắng xây dựng một phương pháp helper như thế này:

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; 
     } 

Nhưng tôi gặp lỗi này:

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

Cảm ơn bạn

+0

Bạn nhận được lỗi trên 'IEnumerable > '? Đối số của một mẫu không thể là một đối tượng, nó phải là một loại. Nhìn vào dòng này 'IEnumerable inner = item như IEnumerable ; 'Tôi nghĩ rằng bạn muốn khởi tạo' pp' như một' IEnumerable > ' –

+0

Không có gì để làm với ASP cổ điển. – Paul

Trả lời

1

Hãy thử:

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; 
    } 
+0

Cảm ơn bạn. Nhưng bây giờ vấn đề là: IEnumerable > pp = entity.Partition (pageSize); Phân vùng không thể nhận biết được – InfinityGoesAround

+0

@hallohallo Phân vùng không phải là một phương pháp của IEnumerable, không phải là phần mở rộng của nó –

Các vấn đề liên quan