2014-11-28 3 views
0

У меня есть простые действия, в которых я делаю запрос к веб-сервису, чтобы получить LIST <> статей для определенной группы.PagedList - способ использования не со всей коллекцией

Затем, используя pagedList (и указав желаемую страницу и номер страницы), я, конечно, указываю подмножество этого списка, который я хочу взять. Проблема в том, что статья для конкретной группы может составлять тысячу, например, и получение информации для всех из веб-службы занимает много времени и даже иногда сокрушает (когда статьи выше 1000)

Есть ли там способ получить статьи только для конкретной страницы и по-прежнему использовать pagedList, потому что я вижу, что, к сожалению, нам нужно вызвать метод ToPagedList для всей коллекции.

public virtual ActionResult ImportShow(String id, int? menuID, string articlegroupID, string menuforHistory,int? counter,int?page,int? pageSize,string articleDescr, int? ArticleID) 
     { 



       List<WebServiceBeaMenu> standartList = ebServiceBea.GetArticle(Convert.ToInt32(menuID), articlegroupID, "", articleDescr); 
       IPagedList<WebServiceBeaMenu> p_ProductsShow = standartList.ToPagedList(actualpage,actualPageSize); 

       p_GroupMenu.ProductMenu = p_ProductsShow; 
       p_GroupMenu.MenuHistory = p_GetMenuHistory.ToList(); 
       p_GroupMenu.MenuLeft = p_GetMenuLeft.ToList(); 
       return PartialView("ImportShow", p_GroupMenu);     
      } 
     } 

вот мой взгляд

@model MvcBeaWeb.GroupMenu 



     @for (int i = 0; i < Model.ProductMenu.Count; i++) 
     { 

     <div> 
      var item = Model.ProductMenu[i]; 



      @Html.PagedListPager(Model.ProductMenu, page => Url.Action("ImportShow", new { id = Model.LanguageName, menuID = @Session["men"], articlegroupID = Session["article"], articleDescr = Session["articleDescr"], pageSize = Session["pageSize"], page })) 

    </div> 
+0

Я не думаю, что это возможно, потому что паллистик действует по всему списку. Что вы можете сделать, это изменить свой вызов в базе данных, чтобы привести только набор статей, которые вы хотите показать. – AnotherGeek

+0

Если вы используете ef или linq2sql, тогда вы можете вернуть IQueryable и сделать pagedlist над этим. Это позволит не выбирать все в первую очередь. – Jamie

ответ

1

Вы должны переписать .GetArticle() Или заменить его ти somethink как .GetPagedArticle() если у вас есть доступ к WebService. Этот метод должен иметь все параметры поискового вызова. Это единственный способ, который я думаю. Ваш метод .GetArticle() должен возвращать объект, как это:

public class Set<T> 
{ 
    public Set() 
    { 
     Elements = new List<T>(); 
    } 

    public Set(List<T> elements, int rowsAll) 
    { 
     Elements = elements; 
     RowsAll = rowsAll; 
    } 

    public Set(List<T> elements, int rowsOnPage, int pageSelected, int rowsAll) 
    { 
     Elements = elements; 
     PageSelected = pageSelected; 
     RowsOnPage = rowsOnPage; 
     RowsAll = rowsAll; 
     PagesAll = (rowsAll % RowsOnPage == 0) ? rowsAll/RowsOnPage : rowsAll/RowsOnPage + 1; ; 
    } 
    public int RowsOnPage { get; set; } 
    public List<T> Elements { get; set; } 
    public int? RowsAll { get; set; } 
    public int PageSelected { get; set; } 
    public int PagesAll { get; set; } 
} 

Где Elements должно быть не все элементы, но только один выгружаемого.

+0

OK для GetArticle - я получу только статьи для этой страницы. Список standartList = ebServiceBea.GetArticle (Convert.ToInt32 (menuID), articlegroupID, "", articleDescr); Но тогда TopagedList хочет целую коллекцию со всеми продуктами (я предполагаю, что таким образом она определяет страницы и ее логические), и у меня нет такого списка. IPagedList p_ProductsShow = standartList.ToPagedList (фактическая страница, actualPageSize); –

+0

Я не получаю этот комментарий. Я имею в виду, что вы должны передавать параметры 'actualpage' и' actualPageSize' в метод 'GetArticle()'. И сделайте свою разбивку на страницы там - в WebService. Если вы можете изменить этот метод и сделать это правильно, это поможет вам. Другая позависть, о которой @Jamie упоминает в своем комментарии, заключается в том, что вы можете получить из 'GetArticle()' not 'List', но' IQueryable' и работать не со всеми элементами, а с Query в методе 'ToPagedList()' –

+0

Ok I передать фактические данные и параметры actualPageSize в метод GetArticle(). и это означает, что, например, я получу информацию для десяти статей из 100, например. Я спрашиваю, как pagedList будет знать, что общее количество статей равно 100, поэтому он может рисовать страницы, например, –

Смежные вопросы