一种方法是创建您自己的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以便您可以更好地控制每个字段的布局和验证。