2009-05-07 2 views
0

Хорошо, это очень раздражающая ошибка, с которой у меня были проблемы со всем утром !..net Изменение порядка событий в событиях страницы

У меня есть настраиваемый элемент управления, который мы использовали во многих проектах, которые имеют свойства, которые установлены и сохранены в ViewState вызывающими страницами onload. элемент управления устанавливает дочерние элементы управления с помощью свойств метода CreateChildControls() настраиваемого элемента управления.

Как обычно, при обратном вызове запускается событие Page_Load, затем запускается метод CreateChildControls элемента управления на странице.

Странный тонкий, хотя у нас есть система входа (пользовательский поставщик членства) на сайте и когда пользователь регистрируется в обратном случае, сначала метод CreateChildControls() запускает объект Page_Load, поэтому свойства управления являются неправильными (задано от предыдущей обратной передачи)

Как могут события стрелять в другом порядке? Я думал, что все события страницы произошли в том же порядке, независимо от того, что и я не вижу, как войти в систему изменит этот порядок.

UPDATE: Кажется, проблема в том, что я не звоню в EnsureChildControls(), но я не уверен, где его следует называть? Если в элементе управления задано несколько свойств, которые используются при настройке дочерних элементов управления, когда я должен позвонить EnsureChildControls(), я думаю, что я не совсем понимаю, что делает EnsureChildControls()?

ответ

4

CreateChildControls вызывается всякий раз, когда им нужна страница ASP.NET. Для этого не существует конкретной точки в цикле страниц. Это может произойти в событии Init, это может произойти в событии Load. Если вы хотите, чтобы ваши дочерние элементы управления были доступны, вызовите метод EnsureChildControls() вашего элемента управления. Вы можете сделать это в событии Init элемента управления, чтобы убедиться, что у вас есть дочерние элементы управления на протяжении всего жизненного цикла, или вы можете делать это каждый раз, когда вам нужна ссылка на один из дочерних элементов управления - например, в getter/setter свойства вашего контроля.

+0

OK Я не совсем уверен, где следует вызывать EnsureChildControls()? Проблема заключается в том, что свойства заданы в событии загрузки страницы, но не используются, поскольку CreateChildControls() уже вызывается в popstback (используя значения свойств из предыдущей обратной передачи. Когда мне следует позвонить EnsureChildControls()? – Sheff

1

При создании свойства элемента управления сервером/пользователе, которым необходим доступ к содержащимся дочерним элементам управления Я использую следующее:

public Whatever SomeProperty 
{ 

    get 
    { 
     EnsureChildControls(); 
     <more code here> 
    } 
    set 
    { 
     EnsureChildControls(); 
     <more code here> 
    } 
} 

Это гарантирует, что ваши потребители управления могут свободно работать с вашим контролем на различных этапах страницы жизненный цикл.

+1

OK Вот что Я думал, но добавив, что у меня есть несколько проблем. Перед созданием CreateChildControls требуется несколько свойств, поэтому я добавил логику для каждого свойства, чтобы проверить это, но при добавлении EnsureChildControls я получаю следующее исключение при обратной передаче. Ошибка для загрузки viewstate. Дерево управления, в которое загружается viewstate, должно соответствовать дереву управления, который использовался для сохранения viewstate во время предыдущего запроса. Это имеет смысл, поскольку CreateChildControls уже был вызван до того, как свойства были установлены o n postback – Sheff

 Смежные вопросы

  • Нет связанных вопросов^_^