存储控件和向现有表单动态添加控件的最佳方式是什么?

本文关键字:控件 最佳 方式 是什么 添加 表单 存储 动态 | 更新日期: 2023-09-27 18:18:42

我有一个显示默认控件的通用表单。我试图建立一个表单队列,如果我们有一个客户端,想要额外的数据,我想存储所需的asp.net控件为每个客户端捕获数据,并与默认的表单一起动态加载它们。

有没有人知道或指导我到一个架构/解决方案来实现这个[存储表单和加载,并动态添加到现有的表单和检索数据从他们传递]。

我最初的想法是为每个客户端使用xml文件,需要比现有的静态表单数据更多的数据,并根据文件名加载此xml(与客户端名称匹配),并将其添加到内容占位符,然后循环通过页面上的按钮单击从这些动态字段获取数据。

存储控件和向现有表单动态添加控件的最佳方式是什么?

这个XML文件可以用于这个例子:

<?xml version="1.0"?>
<!-- Custom fields per tenant/form -->
<Customers>
  <IBM>
    <Employee>
      <Field Id="FirstName" Label="First name" />
      <Field Id="LastName" Label="Last name" />
    </Employee>
  </IBM>
</Customers>

首先在页面上配置XmlDataSource。如果您计划将表单定义与客户一起存储在数据库中,而不是存储在XML文件中,则可以将其替换为SqlDataSource。

<asp:XmlDataSource ID="CustomFields" runat="sever" 
  DataFile="~/App_Data/CustomFields.config"
  XPath="//Customers/IBM/Employee">
</asp:XmlDataSource>
在本例中,我们将使用一个XML文件,每个客户将有一个节点,每种类型的表单将有另一个节点。在本例中,IBM是客户,Employee是表单。当然,XPath属性需要动态设置:
protected void Page_Load()
{
  if(!Page.IsPostBack)
  {
    CustomFields.XPath = String.Format("//Customers/{0}/{1}", CustomerName, FormName);
  }
}

现在您可以使用ListView对表单的一部分进行数据绑定,使用XML中的属性为每个字段显示TextBox控件:

<asp:ListView ID="DynamicFields" runat="server"
  DataSourceID="CustomFields"
  ItemPlaceHolderID="Item">
  <LayoutTemplate>
    <fieldset>
      <legend>Custom fields</legend>
      <asp:PlaceHolder ID="Item" runat="server" />
    </fieldset>
  </LayoutTemplate>
  <ItemTemplate>
    <div>
      <asp:Label runat="server"
        Text='<%# XPath("Field/@Label") %>'
        AssociatedControlID="Field" />
      <br />
      <asp:TextBox ID="Field" runat="server" 
        data-field-id='<%# XPath("Field/@Id") %>' />
    </div>
  </ItemTemplate>
</asp:ListView>

在后面的代码中,您现在可以检索每个字段的值,并使用data-field-id属性将它们映射回去:

protected void Save_Click(object sender, EventArgs e) 
{
  foreach(ListViewItem item in DynamicFields.Items)
  {
    TextBox field = item.FindControl("Field") as TextBox;
    string id = field.Attributes["data-field-id"];
    string value = field.Text;
  }
}

当然,当您还希望将数据加载到编辑表单的字段中时,它会变得更加复杂,但这只是基于您自己的建议的一般方法。

存储需要考虑的一些事情是映射到一个特殊的表,每个表的列对应每种类型的数据(字符串、数字、日期等)。为此,您需要用数据类型注释XML,并基于此验证输入。

<Field Id="FirstName" Label="First Name" Type="String" />
<Field Id="DateOfBirth" Label="Date of birth" Type="DateTime" />

如果您不需要,那么您可以考虑将所有值序列化为单个字符串(JSON?),以便存储在数据库中的单个列中。这使得在数据上运行查询几乎是不可能的。

{ "FirstName": value, "LastName": value }

将所有控件添加到表单中。隐藏可选选项,并根据需要显示它们。

我建议使用绑定,动态地创建您的用户控件并将子控件绑定到队列的数据(使用绑定源),并在回发后从绑定源获取数据并在队列中更新