asp.net-mvc - MVC 中用于灵活调查的正确模型

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

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

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

CREATE VIEW [vw_CombinedSurveyResults] AS

SELECT 'V10_v2' as anTable, UniqueRecordID, ddDate, iIncidNo, bA, bB, bC, null as '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) View (按日期和事件编号过滤),然后将结果显示在表格中,到目前为止一切顺利。

我大脑卡住的部分是决定如何最好地更新选定的个人调查记录,这是一种整洁的方式,并且在创建 future 版本的调查时需要最少的努力.

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

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

我有一个用于更新简化 View (V10_v2)的 Controller ,一切正常……但这只是一个调查版本,它证明了一个概念,但非常笨重。

要继续沿着这条路走下去,意味着我需要创建多个 (MVC) View 和 Controller ,每个调查表一个,但必须有一种更灵活/更简单的方式来组织模型或 View 或两者?

预先感谢您的任何建议。

最佳答案

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

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 语句来根据字段定义确定要查询哪个值表

回复:Viewmodel

这里有很多选项...

首先,您可以创建从公共(public)字段模型继承的多个模型,每种数据类型一个模型。然后,您的调查问卷 View 模型将类似于...

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)设置起来更复杂,但如果您想进一步调整内容,则可以提供更大的灵 active (例如,您可以在定义时直接向类属性添加自定义验证属性)类)。您必须担心诸如缓存实例化类、确保生成的类不会被破坏(例如,被某人将 .Net 代码存储在数据库中的字段名称中)、使您的操作和方法处理动态生成的类等问题。类和一大堆其他东西。

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

关于asp.net-mvc - MVC 中用于灵活调查的正确模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12825129/

相关文章:

java - 如何将 Java 对象转换为 JSON 字符串?

c# - 向成员(member)发送忘记密码的最佳做法

python - 如何在 Tkinter 中实现 MVC 模式

c# - 从对象、 Entity Framework 自动创建数据库表

javascript - 允许 MVC 将 Controller 操作响应视为静态内容

asp.net-mvc - 我应该如何在 Web 应用程序中限定 Entity Framework DbContext 的依赖注入(inject)? (InstancePerHttpRequest 与 SingleInstance)

PHP MVC 一般问题

c# - 使用 MVC、MVP、MVVM 的真实 winforms/wpf 项目

asp.net-mvc - knockout.js viewmodel 未绑定(bind)在 asp.net mvc Controller 中进行发布

c# - .net c# APIController 属性测试