在ASP.NET Web表单中创建动态用户界面

4
我需要创建一个调查页面,其结构从数据库中读取。
Survey QuestionA
a) Answer1 [Radio button]
b) Answer2 [Radio button]
c) Answer3 [Radio button]
d) Answer4 [Radio button]

repeats..

这个页面有许多需要动态添加的问题。当提交表单时,我需要将表单结果存储在Question对象数组中。

我知道的一种方法是在表格中创建动态UI,并通过FindControl获取值。

是否有更好(优雅)的方法来实现这个功能?


几周前我遇到了同样的问题,不得不在页面提交后递归查找相应的控件;我也想知道是否有更优雅的方法 :) - Matten
我相信您需要在回发时重新创建UI。 - softwarematter
我最近回答了一个类似的问题,链接在这里:http://stackoverflow.com/a/8611075/4830。 - Michiel van Oosterhout
5个回答

2
在ASP.Net MVC中,使用默认的模型绑定处理了繁琐的工作。当然,你也可以创建自己的模型绑定器。虽然这并不能像ASP.Net Web Forms一样给你带来自动化的解决方案,但在这种情况下,我更倾向于遵循ASP.Net MVC使用的类似公共模式的命名约定,从而简化它。然后你就可以编写能够随着时间重复使用的代码。以下是Haack博客上解释命名约定的文章链接:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
长期建议是使用ASP.Net MVC,这里的生活会更好 :)

2
我建议创建一个用户控件,实现一个问题(标签)和答案(单选按钮),每个控件(标签、单选按钮)都绑定到用户控件的一个属性。然后您可以从数据库中读取问题,并为每个数据创建此用户控件对象,并将对应的数据设置为该用户控件的属性。要从控件中读取数据,可以反向进行此操作。
尽管在每次回传时必须重新创建用户控件并将默认数据设置为这些控件。
另外,您可以创建具有不同UI的多个用户控件,这些控件继承了像 IQuestion这样的接口,以及一个工厂类,根据环境变量创建每个用户控件。

+1 同意。在 DOM 中查找数据是性能上的噩梦。 - Alex
1
@Craig,我的意思是“不要考虑使用客户端代码来检索数据,无论你如何实现它”。好吧,也许这不太清楚,是我的错。 - Alex
@alex 抱歉,我没有看到那个答案。感谢您指出来。为避免混淆,我已经删除了我的评论。干杯! - Craig

0
你可以使用jQuery的checked属性获取选定的单选按钮,并将它们附加到问题编号上。例如,对于问题1,您有:
所以你可以像这样迭代单选按钮来获取值: $("input[type='radio']").checked

0

您可以通过编程的方式添加控件。

比如说,如果您有一个 aspnet 面板控件,您可以执行...

RadioButton rb = new RadioButton();
rb.ID = "rbRadioButton";
rb.Name = "rbRadioButton";
rb.cssClass = "radioClass";
Panel1.Controls.Add(rb);

抱歉,例子有点严苛,目前手头没有 Visual Studio 来检查,但我希望你能理解。基本上,你可以完全基于数据库构建整个问题。缺点是获取值时必须覆盖 Render 方法(如果我没记错的话,已经过了一段时间了,如果你想让我找到它,我可以给你一个例子)。

我承认这有点过度,但这是一个可能的解决方案。


0

使用 RadioButtonList(可以在工具箱中看到,它是一个 ASP.NET 标准控件)控件来实现这个目的。根据你的需求来决定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接