如何从模型中限制视图所需的属性

How to limit the properties needed for the view from the model

我正在努力通过构建新的 MVC 架构解决方案来理解 Entity Framework 和模型的概念。我只从两个与一个相同的模型开始(现有数据库 - 我必须在 [可能回来并稍后重构] 之后建模),还有更多模型。

我将数据返回到 VIEW 没问题,但是如何缩小 CONTROLLER 以仅查询我需要的项目?在这个例子中,我提交了代码(见下文),但如果我投射 .ToList() 它会抛出异常,因为那不是模型类型。我确信我错过了一些非常简单的东西,但我被卡住了。任何帮助都会很棒。

VIEW

@ModelType IEnumerable(Of CompanyName.Models.QAs)

控制器

Private ReadOnly _db As New Context

Function Faq() As ActionResult

        'Dim query As List(Of ShowFaqsModels)


        'query = From f In _db.Faqs _
        '         Where Not f.Hk_DeletedDt.HasValue _
        '         Or f.Hk_DeletedDt = New DateTime(1900, 1, 1) _
        '         And f.Active = 1 _
        '         Order By f.CategoryId Descending _
        '         Select f.Question, f.Answer


        Return View(_db.Faqs)
    End Function

型号

Imports System.ComponentModel.DataAnnotations

Namespace Models
    Public Class QAs
        <Key>
        Public Property QuestionId As Integer
        Public Property CategoryId As Integer
        Public Property Question As String
        Public Property Answer As String
        Public Property Active As Integer
        Public Property Hk_CreatedDt As DateTime
        Public Property Hk_ModifiedDt As DateTime
        Public Property Hk_DeletedDt As System.Nullable(Of DateTime)

    End Class
End Namespace

************ 编辑 **********

控制器

  Function Faq() As ActionResult

        Dim faqs = From f In _db.Faqs _
                   Where Not f.Hk_DeletedDt.HasValue _
                   Or f.Hk_DeletedDt = New DateTime(1900, 1, 1) _
                   And f.Active = 1 _
                   Order By f.CategoryId Descending _
                   Select New FaqViewModel With {
                                                    .Question = f.Question,
                                                    .Answer = f.Answer
                                                }


        Return View(faqs)
    End Function

添加 - 创建了一个名为 "ViewModels" 的新文件夹 --- 这样做是为了仅使用视图中需要的数据。

VIEWMODELS

Imports System.ComponentModel.DataAnnotations

Namespace ViewModels
    Public Class FaqViewModel
        Public Property Question As String
        Public Property Answer As String
    End Class
End Namespace

再次感谢对此的贡献者。我开始弄清楚这个难题并设计这个解决方案。是的是的,我知道你可以分离到其他项目中,但不需要这个网站。

您描述的模型就是您的数据模型。传递或接受信息的最佳做法 to/from 您的视图是使用新的 class 作为视图模型。它将只有视图所需的信息,没有其他信息。

要注意的是,它们并不总是一对一的映射(尽管有些可能是)。例如,我的视图模型通常有其他信息,例如下拉菜单所需的集合、指示是否应呈现页面某些区域的布尔标志、传递给 javascript 资源所需的 api 键.这完全取决于您的视图需要什么,但想法是您为视图提供它所需的一切,它不应该自己出去获取它,除非没有其他方法(根据我的经验确实会发生这种情况)。

人们已经为数据模型和视图模型之间的转换创建了特定工具(例如 AutoMapper),请注意,大多数人都依赖于相同的对象属性的命名约定,而且大多数人认为这是一种不好的做法使用类似自动映射器的解决方案来接受从浏览器返回的信息。

您正在尝试 return "...(Select f.Question, f.Answer).ToList()",这不会导致 CompanyName.Models.QAs 类型的模型。 因此,要么 return 整个 f.ToList() 要么 如果您认为模型有太多额外的属性以至于您不需要在视图中使用所有这些属性,请使用 ViewModel。 ViewModels 也类似于模型,但它们用于您的视图,与本质上基本上反映您的数据库 tables/relations 的模型形成对比。如果您的视图只需要模型中可能 50 个字段中的 2 个字段,则不要为该视图创建一个 ViewModel。