Как я могу создать объект для представления всех элементов формы HTML? - PullRequest
3 голосов
/ 27 февраля 2010

Отказ от ответственности: Это личный проект, который я делаю для развлечения. Я не собираюсь использовать существующие библиотеки, так как это принесет некоторую радость от изучения большего количества колес .

При этом я работаю над веб-пауком и столкнулся с проблемой представления элементов формы HTML одним объектом.

Что я хочу сделать, так это иметь объект «HTML-документ», который содержит массив всех элементов формы в качестве одного из своих свойств. Проблема в том, что я не могу найти способ представления тегов <input />, а также тегов <select />, поскольку теги select могут иметь несколько дочерних тегов <option />.

Есть ли какой-нибудь хороший способ представить оба тега <input />, которые в основном хранят только пары имя / значение, и теги <select />, которые имеют массив пар имя / значение в одном классе?

Лучшая идея, которую я до сих пор предлагал, - это обрабатывать теги <option /> тега <select /> как отдельные поля формы, подобно тому, как я представляю <input type="radio" /> или <input type="checkbox" />.

Итак, я бы получил это:

class FormField {
    public string Name { get; set; }
    public string Value { get; set; }
    public string Type { get; set; }
}

А затем класс коллекции для итерации:

  • Класс коллекции будет представлять собой «массив массивов». Внешний массив будет иметь один внутренний массив для каждого имени в документе HTML.
  • Его индексатор может получать поля по имени. Этот индекс будет возвращать массив FormField объектов.
  • При перечислении по всем полям формы документа каждая итерация будет иметь массив FormField объектов, поскольку это будет массив массивов.

Это лучшее решение или есть более простой способ представить это?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2010

Вы пытаетесь представить структуру dom или значения, которые будут отображаться в http-посте?

Два входа с одним и тем же именем приведут к тому, что значение будет опубликовано дважды и прочитано так же, как если бы вы установили флажки (с тем же именем) И вы проверили, что происходит, если у вас есть и текстовое поле, и флажок с тем же именем? Можете ли вы отличаться между ними в полученном http-посте? И какой тип вы должны использовать в этом случае?

Попробовал простую коллекцию NameValueCollection, которая позволила бы вам хранить несколько строковых значений на ключ?

1 голос
/ 27 февраля 2010

Я бы рассматривал весь документ как структуру родительско-дочерних ссылок, начиная с тега body. Первый тег - это тег body. Любые теги div, p, form и т. Д. Верхнего уровня попадают в объект Children. Когда вы добираетесь до элементов формы, таких как select, вы можете затем заполнить значения select как дополнительные htmlObjects

class htmlObject {
    public string Name { get; set; }
    public string Value { get; set; }
    public string Type { get; set; }
    public List<htmlObject> Children { get; }
}

В вашем примере вам не хватает свойства Children для представления базовых свойств.

Когда вы готовы определить элементы более подробно, класс htmlObject становится интерфейсом IhtmlObject, и вы затем создаете специализированные классы для каждого тега. Затем тег specialize может реализовать ту функциональность, которую вы хотите обрабатывать для каждого тега специальными условиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...