Я создал класс ASP.NET, основанный на стандарте WebControls.TextBox
, с целью добавления дополнительных свойств, которые будут сохраняться между post-backs. Однако я не могу понять, как сохранить значения в этих свойствах.Сохранение и восстановление свойств в управляемом элементе ASP.NET
Я попытался установить значение свойства в элементы управления ViewState
как часть PreRender
обработчика, но значение, то не доступен в Init
обработчика на пост-спине, потому что ViewState
еще не был настроен.
Я мог искать значения ViewState
в Load
обработчиком контроля, но если страница/UserControl, который использует элемент управления запрашивает значения свойств в процессе его Load
обработчика, контроль еще не достиг своего Load
обработчик, и поэтому такой нет.
Мой текущий класс выглядит примерно так ...
Public Class MyTextBox
Inherits TextBox
Private _myParam As String = ""
Public Property MyParam As String
Get
Return _myParam
End Get
Set(value As String)
_myParam = value
End Set
End Property
Private Sub MyTextBox_Init(sender As Object, e As EventArgs) Handles Me.Init
If Page.IsPostBack Then
_myParam = ViewState("myParam")
End If
End Sub
Private Sub MyTextBox_PreRender(sender As Object, e As EventArgs) Handles Me.PreRender
ViewState("myParam") = _myParam
End Sub
End Class
Я должен отсутствовать что-то действительно просто, например, есть ли атрибут, я могу установить против собственности.
UPDATE
Благодаря @AVD указывая на то, что я на самом деле было очень мало понятия о ViewState и этапов/Load Init, я, наконец, понял все это.
Если у вас есть время (и если вы делаете какие-либо основные работы ASP.NET, вы потребность сделать время), пожалуйста, прочитайте Understand ASP.NET View State документ, который @AVD указал мне. Это объяснит многое.
Однако, что это не объясняет, если вы разместите свой контроль в пределах <asp:Repeater>
, вы можете также выбросить все правила из окна ... и это именно та проблема, с которой я столкнулся.
В конце концов, как мне удалось получить его работы заключается в использовании <asp:PlaceHolder>
управления в повторителе, создать экземпляр моего контроля в ItemDataBound
обработчика ретранслятора, а затем добавить элемент управления в <asp:PlaceHolder>
. .. все сделано в разделе Init
(к счастью, я могу это сделать).
Как Andrew found out in this previous question вы можете оказаться в ситуации, курица/яйцо, где вам нужно, чтобы создать элементы управления в Init
, но вы не будете знать, какие элементы управления вам нужно до Load
.
(я все еще сделал ответ AVD правильным, потому что в контексте моего первоначального вопроса это абсолютно правильно).
К сожалению, я не могу получить эту работу - я до сих пор вопрос о том, что ViewState не инициализируется в точке, родительская страница/UserControl запрашивает информацию (как часть из его 'Load' обработчик) – freefaller
@freefaller Не используйте _myParam, и я не понимаю, почему вы получаете ViewState в ** init ** и назначаете в ** обработчик prerender **. – adatapost
Потому что я пытался заставить его работать.К сожалению, я все еще сталкиваюсь с той же проблемой, независимо от того, как я использую ваш код. Если элемент управления размещен на странице, и эта страница извлекает ctrl.MyParam как часть обработчика 'Load' страниц, значение остается пустым ... потому что я считаю, что' ViewState' для производных элементов управления еще не был инициализирован (по крайней мере, он всегда отображается как «Nothing», насколько я могу видеть) – freefaller