2017-08-01 63 views
0

從我讀過的,我應該使用ViewModels在MVC中填充我的視圖,而不是直接模型。這應該允許我不僅傳遞模型的內容,還傳遞其他信息,例如登錄狀態等,而不是使用ViewBag或ViewData。我遵循了教程,並且我已經將模型和視圖模型成功發送到視圖。我遇到的最初問題是我需要一個分頁視圖,在單獨傳遞模型時很簡單,但在傳遞視圖模型時變得困難。如何繞過MVC-CORE控制器可以傳遞給視圖的限制?

隨着

public class Instructor { 
    public string forename { get; set; } 
    public string surname { get; set; } 
} 

模型和

public class InstructorVM { 
    public Instructor Instructors { get; set; } 
    public string LoggedIn { get; set; } 
} 

我可以創建一個使用純模式Instructor教官的分頁列表,但我不能通過InstructorVM到視圖一個視圖模型併爲它分頁,因爲在分頁LoggedIn中不需要其他屬性會導致問題。如果我通過InstructorVM.Instructors的觀點,我得到的分頁,但沒有得到LoggedIn,因爲這只是模型,我可能已經很好地通過了直接。

有人提出另一種是轉換/展開視圖模型到一個列表或諸如此類這將產生一個對象像這樣獲取傳遞到每一行中重複LoggedIn值的視圖

instructor.forename = "dave", instructor.surname = "smith", LoggedIn="Hello brian" 
instructor.forename = "alan", instructor.surname = "jones", LoggedIn="Hello brian" 
instructor.forename = "paul", instructor.surname = "barns", LoggedIn="Hello brian" 

然後使用Model[0].LoggedIn

顯然,這引起問題的行中檢索,因爲你只能從一個方法通過一個對象返回,要麼InstructorInstructorVMList<InstructorVM>

我試圖找出最佳選擇,讓我從viewmodel分頁(部分返回對象),而不復制viewmodel中的所有內容。

一個建議是使用像React/Angular這樣的JavaScript框架將頁面分解成更多的MVVM做事方式,這樣做的問題在於,儘管通過尋找建議和閱讀1001「最佳JS框架」列表通過谷歌,他們都假設我已經學習了所有的框架,因此可以從可用的選項中選擇最合適的框架。

當我想要做的就是在視圖上顯示一個字符串和一個來自viewmodel的分頁列表。在這一點上,我不在乎如何,我不在乎是否必須學習一個JS框架,或者如果我可以使用MVC內核來做到這一點,但有人可以告訴我如何做到這一點,我可以做的很簡單ASP.NET?如果是「使用JS框架」哪一個? 謝謝

回答

0

我並不完全確定這裏的困難是什麼,因爲分頁和使用視圖模型並不是相互影響的因素。分頁是關於從數據存儲中選擇一個項目的子集,這完全發生在您的初始查詢中。例如,儘管您可能原本已經做了這樣的:

var widgets = db.Widgets.ToList(); 

相反,你會做這樣的事情:

var widgets = db.Widgets.Skip((pageNumber - 1) * itemsPerPage).Take(itemsPerPage).ToList(); 

使用視圖模型只是在此之上的一層,在這裏你那麼就映射查詢的數據,不管它是什麼到您的視圖模型的實例:

var widgetViewModels = widgets.Select(w => new WidgetViewModel 
{ 
    ... 
}); 

如果您使用的是像庫或PagedList類似,這種行爲可能不會立即直接很明顯,因爲默認實現取決於有權訪問查詢集(以便爲您執行跳過/取出邏輯)。然而,PagedList,例如具有StaticPagedList它允許你使用現有的數據集創建IPagedList實例:

​​

在那裏,你會唯一缺少的部分是totalItems,這將需要額外的數查詢在未過濾的查詢集上。

如果您使用不同的庫,應該有某種類似的功能可用。你只需要與文檔進行協商。

+0

我一直在瀏覽https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro的Microsoft文檔,這就是爲什麼我在這裏結束了。按照他們的例子,分頁在後端控制器中完成,模型Instructor的數據的相關分頁子集或InstructorVM.Instructor的數據從控制器傳遞到View。將viewmodel'InstructorVM.Instructor'的可分頁部分從控制器傳遞到視圖會丟失Viewmodel的其他屬性,在本例中爲'LoggedIn' – Glyn

+0

分頁是關於數據的子集,是的,我知道,我的問題不是分頁,它會將所有視圖模型,分頁子集和所有其他屬性添加到視圖中,而文檔不會這樣做。 和其他的例子是類似的,paginate-a-model/don't-paginate-a-viewmodel,因此我在這裏 – Glyn

相關問題