Вопрос

Я создаю 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);
}

Теоретически это привело бы к размещению метки рядом с элементом управления textbox.Я понятия не имею, будет ли работать Div, но вы можете выполнить этот тип действий для флажка, текстового поля, метки и т.д.

Как только элементы управления и метки появятся на странице, вам потребуется какое-либо действие, которое заставит сервер сохранить значения в базе данных.Я бы рекомендовал сохранить имя таблицы и столбца вместе со списком объектов.Затем сопоставьте поле формы со столбцом базы данных для вставки.(имейте в виду, что это объяснение похоже на высоту 200 000 футов)

Другие советы

Вот кое-что, что я очень быстро приготовил для подтверждения концепции.

DynamicForms.zip

Я встроил в VS 2008 SP1.В папке appdata есть база данных sql server, поэтому sqlexpress поможет, если вы захотите запустить это.

Я построил это быстро, так что получилось довольно неаккуратно.

Вероятно, потребуется следующая базовая структура:Форма, Поле, Тип поля.Вам понадобятся бизнес-объекты и таблицы данных для каждого из них, чтобы вы могли хранить конфигурации для каждого поля.

Вероятно, вам понадобится, чтобы у поля было несколько свойств, которые можно задать (например, обязательность), чтобы вы могли отслеживать это независимо для каждого поля.

Затем вам понадобится какая-нибудь утилита, которая может считывать уровень данных, а затем для каждого поля и типа поля знать, какой тип элемента управления создать и как добавить элементы управления на текущую страницу.

Использование тега 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");

Как уже говорили другие, определенно существуют способы сделать это путем динамического добавления элементов управления на страницу ASP.NET во время выполнения.

В качестве альтернативы, хотя я и не использовал Информационный путь Microsoft, из того, что я слышал об этом, он делает довольно много из того, что вы пытаетесь сделать (т.е.разрешить суперпользователям создавать формы / вопросники, размещать их в Интернете и впоследствии собирать данные обратно)

Если у вашего клиента установлена соответствующая версия Microsoft Office, возможно, у него уже есть InfoPath.

Я работал над этим раньше.Скажем, я использовал для этого две таблицы

KeyField_Master - Мастер ключевого поля:для имени поля, типа и является ли оно обязательным или нет?

и

Ключевое поле_детали:хранить значение пользовательских полей в терминах (значение и описание).

Используйте событие 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
{
  // ...
}

Кроме того, вы могли бы обратиться к этому вопросу "Как проверить динамически созданные элементы управления?" Этот вопрос связан с этой процедурой?

Кроме того, проверка может быть на стороне клиента, как описано в приведенном выше вопросе?или на стороне сервера, сохранив созданные поля в списке, тогда вы могли бы проверить этот список во время отправки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top