asp.net mvc 3 和动态视图生成

Posted

技术标签:

【中文标题】asp.net mvc 3 和动态视图生成【英文标题】:asp.net mvc 3 and dynamic view generation 【发布时间】:2011-06-24 16:51:21 【问题描述】:

我正在实施自定义用户配置文件屏幕。

这几乎是一个典型的用户个人资料屏幕,您可以在大多数任何具有某种会员元素的网站上找到它。

就我而言,由于屏幕是市场研究 SAS 产品的一部分,因此配置文件上显示的数据点会因市场研究产品而异。产品的版主会通过提供以下信息来指定需要捕获哪些数据点:

字段名称、显示名称、字段类型(文本、数字、单选按钮、复选框等),必填……

我一直在试图弄清楚如何动态生成 MVC 视图以反映请求的数据点列表。我想尽可能多地使用 MVC 框架,而不必编写自己的帮助程序来生成 html。如果可能的话,我还想使用不显眼的验证。

我对目前最好的方法感到困惑。

我是否尝试使用:

自定义模型绑定器 在运行时生成模型类并将其绑定到视图的代码生成 只生成html

还有其他一些可能更有意义的方法(jQuery 模板)、编辑器模板、一系列局部视图吗?

【问题讨论】:

【参考方案1】:

如果您不确定任何给定操作将提交给服务器的内容,您可以让该操作接受FormCollection 类型的参数,然后遍历字段。此时,您可能希望逐个处理每种类型的字段,使用该字段的名称作为键。

为了将项目发送到视图,只需将每个字段的数据包装在一个类中,例如:

public class DataPoint

    public string FieldName  get; set; 
    public string DisplayName  get; set; 
    public object Value  get; set; 

然后让您的视图迭代您的DataPoints。 EditorFor() 方法将处理Value 的类型检查以产生正确的输入类型。这里唯一另一个棘手的部分是获取 FieldName 作为该输入的名称。

将类构建为运行时对于原本并不太复杂的事情来说将是一项过多的工作。除非您知道要绑定的模型,否则自定义 ModelBinder 不会帮助您,这是问题的根源。

【讨论】:

我已经在与您描述的类似的类中拥有数据点。我试图弄清楚如何将数据点呈现为 HTML,以便我充分利用 javascript 不显眼的验证。我为每个数据点收集了所有相同的信息,就好像我要生成一个模型类代码文件并用数据注释属性装饰属性一样。【参考方案2】:

你能不能继续用命名 div 括起来的所有字段来布置你的视图,然后在你的渲染动作中让控制器添加一个定义为“隐藏”的类

   .hidden
   
      display:none;
   

到每个包含你不需要的字段的 div?

另一种选择是编写动态构建视图的 HTML 扩展方法。您可以为每种控件类型创建部分视图,并且扩展程序将它们一一插入到呈现的 HtmlString 中。

【讨论】:

以上是关于asp.net mvc 3 和动态视图生成的主要内容,如果未能解决你的问题,请参考以下文章

C# ASP.NET MVC:动态更新视图

ASP.NET MVC:动态添加部分视图并将它们反映在视图模型中

Asp.Net MVC 从模型创建视图脚手架不生成 int 属性

ASP.NET MVC 如何从嵌套对象的视图模型集合中动态创建表结构

在 ASP.NET MVC 中从部分视图发布动态表单数据

如何使用 jquery unobtrusive 和 Asp.Net Mvc 验证动态生成的单选按钮组?