【问题标题】:dynamically generated form how to actually save entered data动态生成的表单如何实际保存输入的数据
【发布时间】:2011-05-01 20:12:55
【问题描述】:
我有一个动态生成的表单。
计划是生成它,用户输入数据,然后保存所有这些。
尽管对此略有不同的是,如果表单具有与之关联的先前数据,然后它会加载所有预先填充的数据。 - 然后用户可以更改任何以前的选择。
这真的很麻烦,我知道如果我调用 generateform 而不管回发如何,viewstate 应该接管并记住设置是什么.. 但是,如果表单先前已保存,则如上所述的 generateform 方法会填充表单.哪个会胜出,viewstate 或 field population 的 generateform 方法.. ?
谢谢
自然
【问题讨论】:
标签:
c#
asp.net
forms
dynamic
postback
【解决方案1】:
如果您动态生成任何发布数据或导致回发的表单控件,则需要在回发时重新创建它们,以便在回发后将它们绑定到其数据或事件。从概念上讲,这是有道理的。如果在回发后您的表单中没有控件,您如何查看其内容?
有几种方法可以解决这个问题。
1) 无论如何调用 GenerateForm()。由于您说它预先填充了一些数据,因此您需要对其进行更改,以便可以在不这样做的情况下调用它。 ASP.NET 将使用回发时自动发布的数据填充控件,这正是您想要的。
2) 在 ViewState 变量中保留所有动态生成的控件的列表,以便在回发时重新生成它们。对于大多数涉及不是很简单的动态创建控件的情况(例如,您可能事先不知道确切生成了哪些控件),这是最好的解决方案。通常您希望能够在回发后访问数据,但也许您真的不想重新创建整个表单,因为您不再使用它了。
只要在Page_Load() 或之前重新创建相同类型和ID 的控件,它就会绑定到发布的数据。它不需要在您的表单上完全相同的位置。而且它也不需要使用或显示 - 您可以在呈现表单之前将其销毁,例如,在Page_PreRender()
3) 如果您对此不感兴趣,您可以随时使用 Request.Form 直接查看发布的数据,但这也可能很棘手,因为名称可能与您的表单控件 ID 不完全匹配。 ASP.NET 生成依赖于容器的唯一客户端 ID,这就是您可以在 Request.Form 中找到的内容。如果不重新生成控件,则可能无法轻松确定要查找的 ID。一般来说,您不应该这样做,但这是查看发布数据的一种方式,有时您需要它。