我正在创建一个 ASP.NET 应用程序,其中程序的管理员将能够为用户填写和提交的表单定义自定义字段。
管理员需要定义各种类型的字段,例如复选框、单选按钮、文本框和文本区域供用户填写。管理员还可以定义是否需要这些自定义字段。
我现在正处于计划阶段,想知道如何将这些自定义字段定义存储在数据库中,以及如何将它们呈现出来并使其发挥作用。
编辑
最终用户使用这些动态创建的表单字段提交的表单数据也必须保存在数据库中。
我该如何解决这个问题?
我正在创建一个 ASP.NET 应用程序,其中程序的管理员将能够为用户填写和提交的表单定义自定义字段。
管理员需要定义各种类型的字段,例如复选框、单选按钮、文本框和文本区域供用户填写。管理员还可以定义是否需要这些自定义字段。
我现在正处于计划阶段,想知道如何将这些自定义字段定义存储在数据库中,以及如何将它们呈现出来并使其发挥作用。
最终用户使用这些动态创建的表单字段提交的表单数据也必须保存在数据库中。
我该如何解决这个问题?
这是我为概念证明而快速制作的东西。
我在 VS 2008 SP1 中构建。appdata 文件夹中有一个 sql server db,所以如果你想运行它,sqlexpress 会有所帮助。
我很快建立了这个,所以它很草率。
如果没有完成此操作或其他类似操作,我认为您的数据库结构可能包括控件类型、名称、值类型、是否已验证、如何验证以及是否需要。然后,当您阅读所需控件的记录/数据集时,您可能会将记录集中的控件类型与翻译后的值进行比较,然后将其添加到 Web 表单中。
例如:
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 英尺处)
可能需要以下基本结构:Form、Field、FieldType。您将需要每个业务对象和数据表,以便您可以存储每个字段的配置。
您可能需要该字段具有可以设置的多个属性(例如被要求),以便您可以独立跟踪每个字段。
然后,您将需要某种可以读取数据层的实用程序,然后为每个字段和字段类型知道要制作什么类型的控件,以及如何将控件添加到当前页面。
在主页上使用 asp:PlaceHolder 标记将允许您使用表单构建实用程序向该占位符动态添加控件。
最后,您可能希望为生成的表单的不同部分构建一个包含多个类的样式表,以便客户端可以自定义您生成的任何控件表的字体、间距等。
编辑:
如果表单上输入的数据需要持久化,那么您需要决定是否要拥有可自定义的数据层。您可以拥有一个使用 ALTER TABLE 脚本的空数据库表,以允许客户端根据需要向数据库添加列,然后您可以设置哪个控件绑定到哪个列。控件到数据库列之间的这种映射对于正确存储数据至关重要。
每个控件都可以实例化并添加到页面中。例子:
Label label = new Label();
CheckBox check = new CheckBox();
之后,您应该将控件添加到任何容器的 Controls 属性中:
Panel1.Controls.Add(label);
要在回发后检索控件,可以使用 FindControl 方法。
TextBox name = (TextBox) Panel1.FindControl("name of control");
我以前做过这个。我为此使用了两张桌子,比方说
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
{
// ...
}
另外,您可以参考这个问题“如何验证动态创建的控件?” 这个问题与那个程序有关吗?
此外,验证可能是上述问题中所述的客户端?或服务器端通过将创建的字段存储在列表中,然后您可以在提交时检查该列表。
正如其他人所说,通过在运行时向 ASP.NET 页面动态添加控件,肯定有办法做到这一点。
或者,虽然我没有使用过Microsoft Infopath ,但据我所知,它做了很多你想做的事情(即允许超级用户设计表格/问卷并放到网上并收集数据之后回来)
如果您的客户拥有适当的 Microsoft Office 版本,他们可能已经拥有 InfoPath。