【问题标题】:Dynamic ASP.net Web Forms动态 ASP.net Web 表单
【发布时间】:2014-12-11 22:18:42
【问题描述】:
我正在创建一个 ASP.NET 应用程序,在该应用程序中,程序管理员将能够为用户填写和提交的表单定义自定义字段。
管理员需要定义各种类型的字段,例如复选框、单选按钮、文本框和文本区域供用户填写。管理员还可以定义是否需要这些自定义字段。
我现在正处于计划阶段,想知道如何将这些自定义字段定义存储在数据库中,以及如何将它们呈现出来并使其发挥作用。
编辑
最终用户使用这些动态创建的表单字段提交的表单数据也必须保存在数据库中。
我该如何解决这个问题?
【问题讨论】:
标签:
.net
asp.net
dynamic-controls
【解决方案1】:
这是我为概念验证而快速制作的东西。
DynamicForms.zip
我在 VS 2008 SP1 中构建。 appdata 文件夹中有一个 sql server db,所以如果你想运行它,sqlexpress 会有所帮助。
这个我建得很快,所以很草率。
【解决方案2】:
如果没有完成此操作或其他类似操作,我认为您的数据库结构可能包括控件的类型、名称、值类型、是否已验证、如何验证以及是否需要。然后,当您阅读所需控件的记录/数据集时,您可能会将记录集中的控件类型与翻译后的值进行比较,然后将其添加到网络表单中。
例如:
if(drow["ControlType"].ToString().ToUpper() == "TEXTBOX")
{
Label lbl = new Label();
lbl.Text = drow["ControlLabel"].ToString();
TextBox txt = new TextBox();
//TO GET THE VALUE ON POSTBACK LATER
txt.ID = drow["ControlID"].ToString();
//PROBABLY NOT NECESSARY
Div myDiv = new Div();
myDiv.Controls.Add(lbl);
myDiv.Controls.Add(txt);
//ADD THE DIV ABOVE TO THE FORM/PANEL/DIV/ETC.
MyForm.Controls.Add(myDiv);
}
理论上这会将标签放在文本框控件旁边。我不知道 Div 是否可以工作,但你可以通过 CheckBox、TextBox、Label 等来运行这种类型的东西。
一旦控件和标签出现在页面上,您将需要某种形式的操作来使服务器将值保存到数据库中。我建议将表名和列名与对象列表一起存储。然后将表单字段映射到用于插入的 DB 列。 (记住这个解释就像在 200,000 英尺)
【解决方案3】:
可能需要以下基本结构:Form、Field、FieldType。您将需要每个业务对象和数据表,以便存储每个字段的配置。
您可能需要该字段具有多个可以设置的属性(例如被要求),以便您可以为每个字段独立跟踪。
然后,您将需要某种可以读取数据层的实用程序,然后为每个字段和字段类型知道要制作什么类型的控件,以及如何将控件添加到当前页面。
在主页上使用 asp:PlaceHolder 标记将允许您使用表单构建实用程序向该占位符动态添加控件。
最后,您可能希望为生成的表单的不同部分构建一个包含多个类的样式表,以便客户端可以自定义您生成的任何控件表的字体、间距等。
编辑:
如果表单上输入的数据需要持久化,那么您需要决定是否要拥有可自定义的数据层。您可以拥有一个使用 ALTER TABLE 脚本的空数据库表,以允许客户端根据需要向数据库添加列,然后您可以设置哪个控件绑定到哪个列。控件到数据库列之间的这种映射对于正确存储数据至关重要。
【解决方案4】:
每个控件都可以实例化并添加到页面中。
示例:
Label label = new Label();
CheckBox check = new CheckBox();
之后,您应该将控件添加到任何容器的 Controls 属性中:
Panel1.Controls.Add(label);
要在回发后检索控件,您可以使用方法 FindControl。
TextBox name = (TextBox) Panel1.FindControl("name of control");
【解决方案5】:
正如其他人所说,通过在运行时向 ASP.NET 页面动态添加控件,肯定有办法做到这一点。
另外,虽然我没有使用过Microsoft Infopath,但据我所知,它做了很多你想做的事情(即允许超级用户设计表格/问卷并放到网上然后收集数据)
如果您的客户拥有适当的 Microsoft Office 版本,他们可能已经拥有 InfoPath。
【解决方案6】:
我以前做过这个。
我为此使用了两个表,比方说
KeyField_Master:字段名,类型,是否必填?
和
KeyField_Details:根据(值和描述)存储自定义字段值。
使用 Page_Load 事件创建该字段
if (keyField_type == "T") // Textbox
{
txtBox.Attributes.Add("Type", "T"); // type of field for validation
txtBox.Attributes.Add("IsKeyField", "Y"); // to mark it as a custom field
if (isMandatory == "Y")
txtBox.Attributes.Add("IsMandatory", "Y"); // is it mandatory
// you could set layout of these controls using HTML Tables or any other way you prefer.
htmlCell.Controls.Add(txtBox);
htmlRow.Cells.Add(htmlCell);
tbHTML.Rows.Insert(2, htmlRow);
}
else if // other controls type
{
// ...
}
另外,你可以参考那个问题"How to validate dynamically created controls?"
这个问题与那个程序有关吗?
此外,验证可以是上述问题中描述的客户端吗?
或服务器端通过将创建的字段存储在列表中,然后您可以在提交时检查该列表。