【问题标题】:Correct model to use for flexible survey in MVC在 MVC 中用于灵活调查的正确模型
【发布时间】:2012-10-16 19:15:39
【问题描述】:

我希望创建一个 MVC 应用程序来编辑各种客户调查的结果。但我很难将方法/模型牢记在心。

我的调查结果存储在不同的数据库表(每个版本的调查一个表)中,每个版本的列集略有不同。我创建了一个组合(Sql)视图,它只显示我想要编辑的表列,因为源表包含很多不相关的列。

创建视图 [vw_CombinedSurveyResults] AS

选择“V10_v2”作为 anTable,UniqueRecordID,ddDate,iIncidNo,bA,bB,bC,null 作为“bD” FROM V10_v2

联合 SELECT '10_v1' as anTable, UniqueRecordID, ddDate, iIncidNo, bA, bB, null as bC, bD 来自 V10_v1

联合 选择“V9_v6”作为 anTable、UniqueRecordID、ddDate、iIncidNo、bA、null 作为 bB、null 作为 bC、bD 来自 V9_v6

我的第一个想法是搜索组合(sql)视图(按日期和事件编号过滤),然后在表格中显示结果,到目前为止一切都很好。

让我脑筋急转弯的部分是决定如何最好地更新选定的个人调查记录是一种整洁的方式,并且在创建未来的调查版本时需要最少的努力.

到目前为止,我已经为每个源表创建了一个 sql 视图(缩减为只包含我感兴趣的列),并使用这些视图为每个源表创建了一些 Linq To Sql 类-向下视图。 (这些是“模型”)

我使用其中一个自动生成的类作为模型 a 来创建用于编辑调查值的强类型视图(只有一个版本,v10_v2)。

我有一个用于更新缩减视图 (V10_v2) 的控制器,一切正常……但这只是一个调查版本,它证明了一个概念,但它非常笨重。

要沿着这条路继续下去,我需要创建多个 (MVC) 视图和控制器,每个调查表一个,但必须有一种更流畅/更简单的方式来组织模型或视图或两者兼而有之?

提前感谢您的任何建议。

【问题讨论】:

  • 您的问题是什么...(注意:更改此问题的标题 - 现在太本地化了?)
  • @Nate - 感谢您的编辑,我的大脑冻结也延伸到问题标题 :-)

标签: asp.net-mvc model-view-controller


【解决方案1】:

你可以用不同的方式分解表格...

Surveys
-------
Id
Name
...

Fields
------
Id
SurveyId
Name
DataType

Answers
-------
Id
SurveyId
UserId
...

IntegerValues
-------------
Id
FieldId
AnswerId
Value (INTEGER)

StringValues
------------
Id
FieldId
AnswerId
Value (VARCHAR)

通过这种方式,一切都是完全灵活的,您最终会为每种数据类型创建一个表,因此可以以强类型的方式访问它。您需要一个 switch/select case 语句来确定要根据字段定义查询哪些值表

回复:视图模型

这里有很多选项...

首先,您可以创建多个模型,这些模型继承自一个通用字段模型,每种数据类型一个。然后,您的问卷视图模型将类似于...

Public Class QViewModel
    Public Property QuestionnaireId As Integer
    Public Property Fields As List(Of QField)
    ...
End Class


Public Class QField
    Public Property FieldName As String
End Class

Public Class QFieldInteger
    Inherits QField
    Public Property Value as Integer
End Class

Public Class QFieldString
    Inherits QField
    Public Property Value as String
End Class

这将允许您在创建模型时添加任意数量的QFieldstringQFieldInteger 等...以表示您的问卷。如果您需要为其他字段类型添加自定义编辑器(例如映射到整数的多项选择答案,很像枚举),您还可以添加自定义编辑器

或者,您可以通过Reflection.Emit(快速、复杂)或CodeDOM(运行时速度较慢,使用简单)使用反射动态构建整个事物。这意味着您可以为每个调查创建一个具有适当类型属性的抽象类。

后一种方法(Reflection.Emit/CodeDOM)设置起来更复杂,但如果您想进一步调整事情,则可以提供更大的灵活性(例如,您可以在定义时直接将自定义验证属性添加到您的类属性班上)。您必须担心缓存实例化类等事情,确保您生成的类不会被破坏(例如,有人将 .Net 代码存储在数据库中的字段名称中),让您的操作和方法处理动态生成的类和一大堆其他东西。

我建议您从多模型方法开始,如果您无法获得所需的控制,请切换。

【讨论】:

  • 这显然是最好的方法。使用元数据来描述调查。或者,如果您无法更改现有的“每个版本一个表”方法,您仍然可以使用元数据描述这些表,然后构建动态 SQL 字符串(糟糕!)
  • 感谢您的建议。我以前见过一种类似的方法,其中值都保存在同一个表中(例如,用于字符串值、整数值、十进制值等的列),但我喜欢每种数据类型都有一个表的想法。
  • @user1635901 不客气 - 我个人更喜欢按类型使用表格,因为这意味着您不会无缘无故地在商店中到处都是空白单元格。对我来说它感觉更高效(至少在您完成表的初始设置后)。如果这是您决定采用的答案,请使用左侧的勾号表示接受。如果您需要更多信息,请询问。如果你想等待其他答案,不是问题。无论如何,欢迎来到 SO,我们希望将来能见到你。
  • @Basic - 感谢您的快速回复,我有一个后续问题......视图(或视图模型)的外观如何使最终用户能够一次编辑多个值(例如调查的一部分)?
  • @Basic - 又是一个很好的答案,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2011-08-19
  • 2018-09-20
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多