Как избежать сохранения данных через ViewState для дочернего элемента управления в ASP.NET?

У меня есть элемент управления (скажем, DataGrid или ComboBox), который является дочерним элементом пользовательского элемента управления. Я хочу привязывать его к каждому запросу, а не сохранять его состояние через ViewState. мне нужно уйти EnableViewState=true тем не мение. Я думаю, это означает, что мне нужно вызвать DataBind до вызова TrackViewState().

Я прочитал фантастическое сообщение в блоге TRULY Understanding ViewState, и оно отвечает на мой вопрос в 4. Initializing child controls programmatically, Тем не менее, решения этой статьи далеко не идеальны: динамически создавать дочерние элементы управления (я не являюсь и не могу - слишком много существующего кода), использовать сторонний CodeExpressionBuilder (очень хотелось бы, чтобы это было в коде позади), и используйте OnPreInit (который "не поможет вам вообще, если вы разрабатываете CONTROL").

Поскольку эта статья довольно старая (около 2006 г.), я надеялся, что более новые версии ASP.NET исправят ситуацию, так что теперь есть лучшие решения. Итак, сообщество, есть ли хорошие способы сделать это?

1 ответ

Скотт,

Я думаю, что есть неправильное понимание того, как работает ASP.NET Web Forms Framework. Итак, сначала немного теории.

Страницы веб-форм ASP.NET содержат файлы дизайна и кода. Файл дизайна имеет HTML-разметку и "элементы управления", которые являются ссылочными тегами для пользовательских или пользовательских элементов управления. Каждый элемент, который имеет атрибут runat = "server" это управление сервером (то есть оно доступно из кода по его идентификатору).

Когда страница открывается в браузере, ASP.NET берет файл дизайна, обрабатывает эти контрольные ссылки и, наконец, генерирует чистый HTML.

ViewState - это скрытая переменная в HTML, которая хранит внутреннее состояние всех элементов управления, помеченных runat = "server" а также для свойства EnableViewState установлено значение True.

Скажем, у вас есть DataGrid с EnableViewState = False, В этой сетке есть строки, содержащие серверные элементы управления, и вы хотите, чтобы они были в ViewState. Вы все еще можете иметь их EnableViewState = True и находиться в ViewState, и вы по-прежнему можете связываться с событиями для этих субэлементов управления.

Таким образом, даже если DataGrid отсутствует в ViewState, его дочерние элементы могут быть в ViewState, и вы можете обрабатывать соответствующие события.

Вам нужно будет каждый раз инициализировать DataGrid в событии PageLoad, если вы хотите, чтобы он отображал данные после каждой обратной передачи.

ViewState сохраняет внутреннее состояние элемента управления, поэтому вы не можете иметь некоторые свойства элемента управления в ViewState, а другие - нет во ViewState. Но вы можете иметь дочерние элементы управления (они не являются свойствами, они являются сущностями!), Чтобы быть во ViewState, даже если родительский элемент управления не находится во ViewState.

Дайте мне знать, если вы хотите, чтобы я был более конкретным в этом. Если вы хотите углубиться внутрь, есть замечательная книга от Nikhil Kothari о разработке элементов управления. Я думаю, что я видел это где-то как электронную книгу.

Другие вопросы по тегам