【问题标题】:How do I bypass the limitations of what MVC-CORE controllers can pass to the view?如何绕过 MVC-CORE 控制器可以传递给视图的限制?
【发布时间】:2023-04-05 05:23:01
【问题描述】:

根据我的阅读,我应该使用 ViewModels 在 MVC 中填充我的视图,而不是直接使用模型。这应该使我不仅可以将模型的内容,还可以将其他信息(例如登录状态等)传递给视图,而不是使用 ViewBag 或 ViewData。我已按照教程进行操作,并且已成功将模型和视图模型发送到视图。我最初遇到的问题是我需要一个分页视图,这在单独传递模型时很简单,但在传递视图模型时变得困难。

有一个模型

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,因为这只是模型,我可能已经直接通过了。

建议的另一种方法是将视图模型转换/扩展为列表或类似的东西,这将产生一个像这样的对象并传递给视图

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"

LoggedIn 值在每一行中重复,然后使用 Model[0].LoggedIn 在行中检索

很明显,这个问题是因为你只能从一个方法传回一个对象,InstructorInstructorVMList<InstructorVM>等。

我正在尝试找出最佳选项,让我从视图模型中进行分页(在返回的对象的一部分上),同时不复制视图模型中的所有其他内容。

一个建议是使用像 React/Angular 这样的 JavaScript 框架将页面分解为更 MVVM 的处理方式,但问题在于尽管通过 Google 寻找建议并阅读了 1001 个“最佳 JS 框架”列表,他们都假设我已经学习了所有的框架,因此可以从可用的选项中选择最合适的一个。

当我想要做的只是从视图上的视图模型中显示一个字符串和一个分页列表时。在这一点上,我不在乎如何,我不在乎我是否必须学习 JS 框架,或者我是否可以只使用 MVC 核心来做到这一点,但是有人可以告诉我如何做这件事,我可以很简单地做到ASP.NET?如果是“使用 JS 框架”,是哪一个? 谢谢

【问题讨论】:

    标签: asp.net-core-mvc javascript-framework


    【解决方案1】:

    我不确定这里有什么困难,因为分页和使用视图模型不是相互影响的因素。分页就是从数据存储中选择项目的子集,这完全发生在您的初始查询中。例如,虽然您最初可能做了类似的事情:

    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 实例:

    var pagedWidgets = new StaticPagedList<WidgetViewModel>(widgetViewModels, pageNumber, itemsPerPage, totalItems);
    

    在那里,您唯一缺少的部分是 totalItems,这将需要对未过滤的查询集进行额外的计数查询。

    如果您使用不同的库,应该有一些类似的功能可用。您只需要与文档协商即可。

    【讨论】:

    • 我一直在阅读来自docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro 的 Microsoft 文档,这就是我最终来到这里的原因。按照他们的示例,分页在后端控制器中完成,模型Instructor 的数据或视图模型InstructorVM.Instructor 的数据的相关分页子集从控制器传递到视图。将视图模型 InstructorVM.Instructor 的可分页部分从控制器传递到视图会丢失视图模型的其他属性,在本示例中为 LoggedIn
    • 分页是关于数据子集的,是的,我知道,我的问题不在于分页,它正在获取视图的所有视图模型、分页子集和所有其他属性,文档不行。其他示例也类似,paginate-a-model / don't-paginate-a-viewmodel,因此我在这里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多