这样做的一种方法是创建您自己的ModelBinder
,这将是您生成的表单的核心。 modelbinder负责验证ModelState
并重建类型为ViewDataModel
(假设您的视图已输入)。
的DataAnnotations模型绑定可能是此通过Attributes
您ViewDataModel
一个很好的参考此自定义模型绑定器可以让你做的是描述属性的验证(在UI呈现提示)。但是,这是所有定义的编译时间,但是可以开始编写自定义模型绑定器。
在你的情况下,你的模型联编程序应该从xml文件/字符串获得运行时字段的验证。
如果你有这样一个路径:
routes.MapRoute(null, "Forms/{formName}/", new { action = "Index", controller = "Forms", formName = ""}),
然后,你可以找到正确的形式的XML FormsController.Index(string formName)
,并把它传递给视图。
FormsModel
应该包含所有可能的方法来获取数据我没有看到任何其他方式。 Xml可以映射到函数名称(可能是参数),您可以使用FormsModel
上的反射来调用ViewData
或输入ViewDataModel
与数据。
窗体索引视图可以通过HtmlHelper
扩展生成一个表单,该表单需要XmlDocument
。
然后,当您(或asp.net mvc)将您的表单绑定到您的ViewData
您的自定义模型联编程序被调用时,它可以检查当前控制器值以查找formName并查找相应的保存所有验证规则的xml 。然后ModelBinder
负责填写ModelState
任何运行时定义的错误。
这是一个艰巨的任务,但是当在我看来:)
更新一个更好的替代模型数据将是一个非常松散的数据库架构大卫利德尔指出被拉断成功地值得的。我仍然经历了将它保存为xml(或其他序列化格式)的麻烦,并使用它来生成视图并保存自定义的验证规则,以便您可以更好地控制每个字段的布局和验证。
我反对结束这个问题。在特定的服务器端框架*上生成运行时生成的表单*的体系结构非常广泛,但是如下面的答案所证明的,它显然是可以回答的。所有架构问题都只是因为架构决策是高层次的,有利有弊吗? – 2017-08-18 18:11:13