Этот 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 на странице.Вы можете поменять его для SqlDataSource, если вы планируете хранить определение формы в базе данных вместе с клиентом, а не в файлах XML.
<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 }