一种方法是创建您自己的ModelBinder
,这将是您生成的表单的核心。模型绑定器负责验证ModelState
和重建类型ViewDataModel
(假设您的视图是类型化的)。
DataAnnotations模型绑定器可能是一个很好的参考,此自定义模型绑定器允许您通过Attributes
描述ViewDataModel
属性的验证(并提示 UI 呈现)来执行此操作。然而,这都是定义的编译时间,但对于开始编写自定义模型绑定器将是一个很好的参考。
在您的情况下,您的模型绑定器应该在运行时从 xml 文件/字符串中获取字段的验证。
如果你有这样的路线:
routes.MapRoute(null, "Forms/{formName}/", new { action = "Index", controller = "Forms", formName = ""}),
然后您可以在其中找到正确的表单 xmlFormsController.Index(string formName)
并将其传递给视图。
应该包含所有可能的FormsModel
方法来获取数据,我看不到任何其他方式。Xml 可以映射到一个函数名(甚至可能是参数),您可以使用反射调用该函数名FormsModel
来填充ViewData
或键入ViewDataModel
数据。
表单索引的视图可以通过一个HtmlHelper
扩展从该 xml 生成一个表单,该扩展采用XmlDocument
.
然后,当您(或 asp.net mvc)将您的表单绑定到您ViewData
的自定义模型绑定器时,它可以检查当前控制器值以查找 formName 并查找包含所有验证规则的相应 xml。然后ModelBinder
负责填充ModelState
任何运行时定义的错误。
这是一项艰巨的任务,但在我看来,成功完成后非常值得:)
正如 David Liddle 所建议的那样,更新模型数据的更好替代方案将是一个非常松散的数据库模式。我仍然会遇到将其保存为 xml(或其他序列化格式)并使用它来生成视图并为自定义保存验证规则的麻烦,ModelBinder
以便您可以更好地控制每个字段的布局和验证。