ASP.NET MVC中的动态(运行时生成)表单

Rob*_*ool 24 asp.net-mvc dynamic-data

这是一个一般设计问题: 如何在ASP.NET MVC中实现动态(运行时生成)表单?

情况如下:

  1. 站点管理员可以使用GUI(MVC视图)定义表单参数(字段,字段类型,验证).
  2. 根据需要,运行时根据管理配置为最终用户生成表单.我假设所有这些逻辑都将驻留在控制器中 - 或者可能是扩展方法,动作过滤器或类似的东西.
  3. 最终用户填写表单,点击提交,信息在数据库中捕获.

自定义不需要支持嵌套控件,第三方控件等等,但我怀疑一个非常优雅的设计可以实现这一点.大多数情况下,我只需要管理员能够指定其他字段作为文本框,复选框,单选按钮和组合框.我还需要应用程序为数据分配一个空间以保存在数据库中,但我相信我已经找到了那个部分.

谢谢您的帮助.

Ron*_*rby 12

我在最近的一个项目中有同样的需求.我为此创建了一个类库.我刚刚发布了一个新版本的库.

也许它可以帮助你: ASP.NET MVC动态表单


Mar*_*man 1

实现此目的的一种方法是创建您自己的表单ModelBinder,它将成为生成表单的核心。模型绑定器负责验证ModelState和重建类型化ViewDataModel(假设您的视图已类型化)。

DataAnnotations模型绑定器可能是一个很好的参考,这个自定义模型绑定器允许您通过描述属性的验证(并提示 UI 渲染)来执行此操作。然而,这都是定义的编译时间,但对于开始编写自定义模型绑定器来说是一个很好的参考。AttributesViewDataModel

在您的情况下,您的模型绑定器应该在运行时从 xml 文件/字符串获取字段的验证。

如果你有这样的路线:

routes.MapRoute(null, "Forms/{formName}/", new { action = "Index", controller = "Forms", formName = ""}),
Run Code Online (Sandbox Code Playgroud)

然后您可以找到正确的表单 xmlFormsController.Index(string formName)并将其传递给视图。

应该FormsModel包含所有可能的获取数据的方法,我没有看到任何其他方法可以解决这个问题。Xml 可以映射到一个函数名称(甚至可能是参数),您可以使用反射来调用该函数名称来FormsModel填充ViewData或键入ViewDataModel数据。

表单索引视图可以通过HtmlHelper采用XmlDocument.

然后,当您(或 asp.net mvc)将ViewData表单绑定到自定义模型绑定器时,它可以检查当前控制器值以查找 formName 并查找包含所有验证规则的相应 xml。然后ModelBinder负责填充ModelState任何运行时定义的错误。

这是一项艰巨的任务,但在我看来,当成功完成时,这是非常值得的:)

正如 David Liddle 所建议的,更新模型数据的更好替代方案是非常松散的数据库模式。我仍然会遇到将其保存为 xml(或其他序列化格式)并使用它来生成视图并保存自定义验证规则的麻烦,ModelBinder以便您可以更好地控制每个字段的布局和验证。