2012-06-25 4 views
1

Я создал класс 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 правильным, потому что в контексте моего первоначального вопроса это абсолютно правильно).

ответ

1

Вы должны сохранить/получить значение в/из ViewState в аксессуарах свойств.

Public Property MyParam As String 
    Get 
     If IsNothing(ViewState("myParam")) Then 
      return string.Empty 
     End IF 
     Return ViewState("myParam").ToString() 
    End Get 
    Set(value As String) 
     ViewState("myParam") = value 
    End Set 
End Property 
+0

К сожалению, я не могу получить эту работу - я до сих пор вопрос о том, что ViewState не инициализируется в точке, родительская страница/UserControl запрашивает информацию (как часть из его 'Load' обработчик) – freefaller

+0

@freefaller Не используйте _myParam, и я не понимаю, почему вы получаете ViewState в ** init ** и назначаете в ** обработчик prerender **. – adatapost

+0

Потому что я пытался заставить его работать.К сожалению, я все еще сталкиваюсь с той же проблемой, независимо от того, как я использую ваш код. Если элемент управления размещен на странице, и эта страница извлекает ctrl.MyParam как часть обработчика 'Load' страниц, значение остается пустым ... потому что я считаю, что' ViewState' для производных элементов управления еще не был инициализирован (по крайней мере, он всегда отображается как «Nothing», насколько я могу видеть) – freefaller