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

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

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

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

1 Ответ

0 голосов
/ 04 марта 2010

Скотт,

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

Страницы ASP.NET Web Forms содержат файлы дизайна и кода с выделенным кодом. Файл дизайна имеет 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 о разработке элементов управления. Я думаю, что я видел это где-то как электронную книгу.

...