Удалить динамически созданные элементы управления из середины набора

Может быть, я заимствую проблемы, но я окунулся в динамическое создание элементов управления. Я создаю форму на лету, которая позволяет пользователю вводить столько строк данных, сколько он пожелает.

У меня есть методы для создания элементов управления на основе нажатия кнопки, и я знаю, что пока мои элементы управления имеют один и тот же идентификатор для каждой обратной передачи, ViewState будет заполнять их данными, которые у них были до обратной передачи.

Мой вопрос: скажем, пользователь добавил 5 строк и заполнил их. The решает удалить строку 3. Самый простой способ — просто вызвать parent.Controls.Remove("ID"). Обновляет ли это ViewState, чтобы я мог просто уменьшить свой счетчик на 1 и перенумеровать оставшиеся элементы управления с 0 на 3, или мне нужно отслеживать, какой из них был удален, и сохранять нумерацию 0, 1, 3, 4?

Нужно ли мне что-то делать, чтобы очистить запись ViewState об удаленном элементе управления?


person cptully    schedule 27.10.2017    source источник
comment
Вместо того, чтобы спрашивать, вы можете попробовать сделать это   -  person Marco Salerno    schedule 27.10.2017
comment
Пока нет проблем. Я вступаю на совершенно новую для меня территорию и задал вопрос, чтобы лучше понять.   -  person cptully    schedule 30.10.2017


Ответы (1)


При разработке приложения ASP.NET Forms, если вы работаете в контексте ASP.NET Forms инфраструктуры и объектов между загрузка страницы и обратная передача, вы будете в безопасности. Хотя иногда сложно обойтись без добавления пользовательского кода. Обработка этого в коде — лучшее место для этого, для динамического добавления элементов управления на страницу.

Когда вы удаляете элемент управления, ViewState должен обновляться автоматически, так как вы используете метод ASP.NET Forms непосредственно в элементе управления, когда вы вызываете parent.Controls.Remove("ID"). В случае, если вы настраиваете имена элементов управления, вам нужно будет предоставить все идентификаторы или имена самостоятельно, чтобы они были различны для страницы. Итак, здесь я предполагаю, что у вас есть пользовательское имя элемента управления, и вы знаете, что на самом деле поставить вместо "ID".

ViewState обычно прозрачен для вас в том, что касается кодирования. Иногда вы можете вручную очищать ViewState между постбэками (like for a form with a password, when every visit to the page you need to clear the value). ViewState также можно изменить на off, поэтому подумайте, нужны ли вашему приложению дополнительные накладные расходы для ViewState. В динамических формах я бы сделал все возможное, чтобы добавить элементы управления или привязку данных к пользовательским источникам данных в коде позади. Причина заключается в регистрации сценариев на стороне клиента, поэтому среда ASP.NET Forms знает о сценариях, а обработка пользовательского атрибута id или схем именования на стороне клиента может быть затруднена для отладки или обработки из обязательная точка зрения.

Я лично интегрировал приложение ASP.NET Forms с AngularJS 1.6, и хотя это было сложнее и требовало большей настройки, чем с < strong>ASP.NET MVC, это все еще было возможно и предложило мне хороший способ создания динамических форм руками ASP.NET. Однако для обратной привязки к значениям формы в коде позади требуется поиск и выборка значений из Request.Form Collection. Если сделать это таким образом, если ваша форма является внешней по отношению к ASP.NET, для этих объектов отсутствует ViewState.

Обновляет ли это ViewState, чтобы я мог просто уменьшить свой счетчик на 1 и перенумеровать оставшиеся элементы управления с 0 на 3, или мне нужно отслеживать, какой из них был удален, и сохранять нумерацию 0, 1, 3, 4?


Что касается стратегии, которую вы здесь упоминаете, пример кода будет наиболее полезным. Я должен сделать много предположений, чтобы предположить, что может произойти. Я мог бы сказать вам, что все в порядке, но вы все равно могли упустить что-то, влияющее на результат в ваших личных результатах. При удалении строки автоматически обновляется ViewState. Что касается отслеживания вашей схемы нумерации того, как вы называете свои идентификаторы элементов управления с различными значениями, я бы лично не оставлял пробелы в числах, поэтому придерживайтесь 0 to 3, и это упростит ваш код, и вы не нужно будет отслеживать столько в коде позади, иначе это не повлияет на вашу логику рендеринга. Таким образом, элементы управления уникальным образом привязываются к исходному коду во время постбэка, и вы можете легко перебирать коллекции элементов управления, не беспокоясь о схемах именования.

person Ryan Mauldin    schedule 27.10.2017
comment
спасибо за подробное обсуждение! Это моя первая попытка написать форму ASP.Net с нуля, и, с моей точки зрения, она довольно сложна, поэтому ваше обсуждение вышеизложенных тонкостей чрезвычайно полезно! - person cptully; 27.10.2017
comment
Нет проблем, пожалуйста, проголосуйте за ответ, если он соответствует вашим потребностям. Мне нужны очки опыта, так как мой аккаунт новый :). Или дайте мне знать, что я могу еще ответить. - person Ryan Mauldin; 27.10.2017
comment
@cptully, если вы новичок в формах ASP.NET и у вас нет особой потребности в них или существующих приложениях, использующих формы ASP.NET вместо этого я бы потратил ваше время на изучение ASP.NET MVC. Привязка данных к объекту Models и отсутствие всех ViewState, о которых нужно беспокоиться, имеет огромный смысл по сравнению с Forms. Также отрасль внедряет ASP.NET MVC для новых приложений. Формы в наши дни более устаревшие. - person Ryan Mauldin; 27.10.2017
comment
Я изучал MVC в Java с помощью Spring, поэтому мне удобно работать с MVC, но у меня есть особая потребность в ASP.Net Forms. Я взял на себя обслуживание старого веб-сайта на основе Forms. Спасибо за совет. - person cptully; 30.10.2017
comment
сказал: Что касается стратегии, которую вы здесь упоминаете, пример кода был бы наиболее полезным. и я согласен! Если у меня возникнут проблемы, я опубликую новый вопрос с конкретными деталями кода и проблемой, которую он вызывает. - person cptully; 30.10.2017