#c# #asp.net
#c# #asp.net
Вопрос:
Моя проблема в том, что у меня есть дизайнер, который создаст пользовательскую страницу aspx bu без каких-либо элементов управления .net. Мне нужен способ динамического добавления элементов управления. Пока единственными типами элементов управления будут текстовые поля и кнопка, но существует 30 вариантов того, какими могут быть текстовые поля (имя, номер телефона, электронная почта и т.д.). Также текстовые поля могут быть обязательными, а могут и не быть. Как только текстовые поля будут добавлены, форма будет отправлена в базу данных.
Моей первой мыслью было заставить дизайнера разместить что-то вроде [name], а затем заменить это пользовательским элементом управления с текстовым полем name и средством проверки обязательных полей. Для того, чтобы определить, должен ли быть включен валидатор, я подумал, что заполнитель места мог бы выглядеть следующим образом: [name;val] или [name;noval]. Я мог бы либо динамически заменять заполнители в коде, либо настроить инструмент, с помощью которого пользователь вставляет свой html-код в текстовое поле и нажимает кнопку, которая затем выдает необходимый код для создания aspx-страницы.
Я уверен, что должен быть лучший способ сделать это, но это довольно уникальная проблема, поэтому я не смог найти никаких альтернатив. У кого-нибудь есть какие-нибудь идеи?
Спасибо,
Kirk
Комментарии:
1. Почему дизайнер не может использовать ASP.NET элементы управления напрямую? Разметка была отделена от кода также для поддержки этих действий.
2. Ваш дизайнер оказывает вам медвежью услугу. Ему было бы проще разработать это, вам добавить элементы управления, а затем ему оформить это. Это смешно, что он не может использовать . СЕТЕВЫЕ элементы управления.
3. Меня попросили сделать это, чтобы быстро создавать формы. Честно говоря, я не уверен, почему дизайнер не может сам разместить элементы управления
Ответ №1:
ЕСЛИ ваш дизайнер предоставляет вам html-страницы, просто создайте новый веб-сайт. скопируйте и разместите все HTML-страницы с папками изображений и всем остальным в свой проект. затем для каждой HTML-страницы создайте страницу aspx (с тем же именем), скопируйте и разместите теги html, которые находятся между, на странице aspx, а для основного текста скопируйте и вставьте теги HTML-страницы, которые находятся между, на страницу aspx. Теперь у вас есть ваша aspx-страница, точно такая же, как html-страница.
Комментарии:
1. Проблема с этим заключается в том, что я в принципе не собираюсь участвовать в формах по мере их создания. Цель этого — позволить дизайнеру и отделу, в котором он работает, создавать эти формы независимо
2. У меня была такая же проблема при работе с дизайнерами в разных отделах. Я решил свою проблему, установив VS 2010 Express на компьютеры разработчиков и посоветовав им, как все делать в VS designer. Тогда это сэкономило мне много времени.
Ответ №2:
Звучит как попытка перепроектировать решение того, что должно быть не проблемой.
Как упоминал @Alessandro в комментарии выше, почему дизайнер не может предоставить вам страницы с разметкой элементов управления? В нынешнем виде дизайнер предоставляет вам не столько «пользовательский aspx», сколько «пользовательскую html-страницу». Если разработчик обещает ASPX, но предоставляет только HTML, это неверное толкование где-то в бизнес-требованиях.
Однако, даже если дизайнер по праву предоставляет только HTML, с этим не должно быть проблем. В худшем случае вы можете настроить каждый необходимый вам элемент на сервере так, чтобы runat="server"
доступ к ним осуществлялся на стороне сервера. Или, возможно, лучше было бы просто заменить их разметкой элемента управления ASPX для соответствующих элементов управления.
Ответ №3:
Напишите простой анализатор, который распознает теги […] и заменит их соответствующими элементами управления. Это довольно легко сделать, и я часто это делал… обычно я использую тег $$ (..); хотя, но это не имеет значения, пока ваш анализатор знает ваши теги.
Такой анализатор будет состоять из простого конечного автомата, который может находиться в двух состояниях: текстовом режиме или режиме тегов. Цикл по всей странице -текст, символ за символом. Пока вы находитесь в текстовом режиме, вы продолжаете добавлять каждый символ во временный буфер. Как только вы переходите в режим тегов, вы создаете LiteralControl с содержимым временного буфера и добавляете его в нижнюю часть вашего дерева элементов управления и освобождаете буфер.
Теперь вы по-прежнему продолжаете добавлять каждый символ в буфер, но когда вы снова переходите в текстовый режим, вы анализируете содержимое буфера и создаете правильный элемент управления — это может быть простая инструкция switch case . Добавьте элемент управления в нижнюю часть вашего дерева элементов управления и продолжайте перебирать остальные символы, пока не дочитаете до конца, и продолжайте переключаться между текстовым режимом и режимом тегов, добавляя литеральные элементы управления и конкретные элементы управления.
Простой пример такого анализатора… написано в блокноте за 4 минуты, но вы должны уловить идею.
foreach (var c in text)
{
buffer.Append(c);
if (c== '[' amp;amp; mode == Text)
{
mode = Tag;
Controls.Add(new LiteralControl(buffer));
buffer.Clear();
}
if (c == ']' amp;amp; mode == Tag)
{
mode = Text;
switch (buffer)
{
case "[name]": Controls.Add(new NameControl());
... the rest of possible tags
}
buffer.Clear();
}
Комментарии:
1. Я думал о том, чтобы сделать что-то в этом роде. Мне просто любопытно посмотреть, был ли лучший способ сделать это, о котором я не думал. Спасибо
2. вы могли бы выполнить сопоставление с регулярными выражениями и извлечь текст, используя начальный и конечный индексы совпадений, но такой простой анализатор, как этот, всегда будет быстрее.