动态ASP.net Web窗体
-
21-08-2019 - |
题
我创建了该程序的管理员可以定义自定义字段形式的用户将填写并提交ASP.NET应用程序。
在管理员需要定义各种类型的像复选框字段,单选按钮,文本框,和文字区域的用户填写。管理员还可以定义这些自定义字段是否应是必需的。
我在规划阶段,现在,我想知道关于我如何将这些自定义字段定义存储在数据库中,我将如何呈现出来,使它们的功能。
修改
这是由最终用户与这些动态创建的表单字段提交的表格数据也已经在数据库中被持久。
我怎样才能解决这个问题?
解决方案
而不必做这个还是真的这样的事情,我会想你的数据库结构可能包括控件的类型,它的名字,它的值类型,如果它的验证,如何验证它,如果它的需要。然后,当您是通过记录读/控件数据集需要的话,你可能会在记录控制类型比较经翻译的值,然后将其添加到网络表单。
例如:
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);
}
这在理论上将使旁边的文本框控件的标签。我不知道,如果事业部的工作,但你可以通过这种类型的事情对复选框,文本框,标签等。
运行在控件和标签页面上,你会想要某种形式的行动,以使服务器的值保存到数据库。我建议你使用对象的列表存储在表和列名。然后,表单字段映射上为插入一个数据库列。 (记住对此的解释是一样以200,000英尺)
其他提示
下面是一些我都刮起了真正的快速的概念证明。
我建于VS 2008 SP1。有一个在AppData文件夹一个SQL Server数据库,所以SQLEXPRESS会帮助,如果你想运行此。
我迅速建立了这个,所以这是很草率的。
将可能需要以下基本结构:表田地的FieldType。你需要的业务对象和数据表制定的,因此您可以存储配置为每个字段。
您很可能需要领域具有可设置(如被要求),这样就可以独立跟踪此为每个字段的几个属性。
然后,您会需要一些实用的,可以读取数据层,然后为每个字段和字段类型知道做什么类型的控制,以及如何将控件添加到当前页面。
使用ASP:主页上占位符标记将允许您控制使用形式建设公用动态地添加到该占位符
。最后,你可能想建立一个样式表与几类对于生成使得客户机可以自定义字体的形式,间隔,则生成任何的控制表中的等的不同部分。
修改强>
如果表单中输入的数据需要被持久化,那么你需要决定,如果你想有一个自定义的数据层。你可以有你使用ALTER TABLE脚本以允许根据需要将客户端将列添加到数据库中的一个空数据库表,然后就可以设置哪些控件绑定到其列。控制到数据库列之间的这种映射将是至关重要的正确存储的数据。
每个控制可以被实例化,并添加到页面。 例如:
Label label = new Label();
CheckBox check = new CheckBox();
这之后,应该控制加至任何容器的Controls属性:
Panel1.Controls.Add(label);
要回发后检索控制可以使用的方法FindControl。
TextBox name = (TextBox) Panel1.FindControl("name of control");
正如其他人所说,有通过在运行时动态地添加到控制ASP.NET页面这样的肯定的方式。
可替换地,虽然我还没有使用 Microsoft InfoPath的时,从什么我听说过它,但它确实相当多的你正在尝试做的(即允许超级用户设计表单/问卷调查,并把在网络上,并收集数据,早在事后)
如果您的客户端有相应的Microsoft Office版本,他们可能已经InfoPath中
我之前制作此。 我用这两个表,让我们说
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
{
// ...
}
另外,你可以参考这个问题“如何验证动态创建的控件?” 这个问题是有关这一程序?
此外,如在上述问题中所述的验证可以是客户端? 或服务器端通过在列表中存储创建的字段,那么你可以检查提交的时间列表。