2012-01-15 80 views
3

我想使用MvcPager3將分頁添加到我的某個視圖中。這很簡單,除了我已經使用AutoMapper將我的模型映射到簡單的視圖模型。Automapper和MvcPager3一起工作

 List<Call> calls = (from p in db.Calls orderby p.ID descending select p).ToList(); 

     var viewModel = new List<CallListItem>(); 

     Mapper.Map(calls, viewModel); 

     return View(viewModel); 

我想這可能是因爲與此

var viewModel = new PagedList<CallListItem>(); 

替換該行

var viewModel = new List<CallListItem>(); 

但PagedList有一個構造函數,需要的項目列表一樣簡單。由於automapper將爲我這樣做,我想我可能會傳遞null,但它不起作用。

任何人都有和諧地使用這兩個組件的經驗嗎?

由於

編輯:

實測值到MvcPager替代稱爲PagedList。它更好,因爲它有一個StaticPagedList類,您可以將它用於已經分頁的數據。

回答

3

您可以在映射後的分頁瀏覽模式:

var calls = (from p in db.Calls orderby p.ID descending select p).ToList(); 
var viewModel = Mapper 
    .Map<IEnumerable<Call>, IEnumerable<CallListItem>>(calls) 
    .ToPagedList(currentPage, pageSize); 
return View(viewModel); 
+0

謝謝,但有時分頁的元素將成爲另一個視圖模型的成員,例如.. MyViewModel.SomePagedElements,我希望Automapper也能夠處理這些情況,而無需人工干預。 – NoPyGod 2012-01-15 22:05:45

+0

@NoPyGod,所以你基本上想讓AutoMapper除了源類型之外還知道'currentPage'和'pageSize'? AutoMapper不打算以這種方式使用。它映射單個源類型和單個目標類型。 – 2012-01-15 22:07:21

+0

嗯好點:) – NoPyGod 2012-01-15 22:09:00

1

或者,您可以先分頁通過使用StaticPagedList事後映射。 這爲我工作:

var calls = (from p in db.Calls orderby p.ID descending select p).ToPagedList(); 
var viewModel = Mapper.Map<IEnumerable<CallListItem>>(calls); 
return new StaticPagedList<CallListItem>(viewModel, calls); 

我這樣做是因爲我不想以後列出,以便所有對象的頁面。

基於這個不錯的post

+0

你不需要GetMetatada。只是通過電話 – regisbsb 2014-05-10 16:16:28

+0

謝謝,@regisbsb,我已經更新了答案(雖然沒有自己測試過)。 – Alvis 2014-05-12 11:49:59

+0

我應該更新Mapper.Map > Mapper.Map >,我相信返回類型是在Automapper上,並且傳入是被傳入的。 – regisbsb 2014-05-13 12:08:44