3

我正在寻找创建一个 MVC 应用程序来编辑各种客户调查的结果。但我正在努力让这种方法/模型在我的脑海中出现。

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

创建视图 [vw_CombinedSurveyResults] AS

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

UNION SELECT '10_v1' as anTable, UniqueRecordID, ddDate, iIncidNo, bA, bB, null as bC, bD FROM V10_v1

UNION SELECT 'V9_v6' as anTable, UniqueRecordID, ddDate, iIncidNo, bA, null as bB, null as bC, bD FROM V9_v6

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

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

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

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

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

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

在此先感谢您的任何建议。

4

1 回答 1

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

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

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

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

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

于 2012-10-10T17:46:51.513 回答