2017-08-01 84 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

相关问题