O que é a maneira correta para manter o estado em um controle de servidor personalizado?
-
03-07-2019 - |
Pergunta
Isso funciona, mas é a maneira correta de fazê-lo ???
Eu tenho um controle de servidor personalizado que tem uma caixa [de entrada] nele. Eu quero que ele meio que imitam o ASP.NET TextBox, mas não completamente. Quando a caixa de texto é processado eu tenho um javascript que permite aos usuários selecionar valores que são, então, colocados em que a caixa de entrada.
Eu tenho uma propriedade de texto pública sobre o controle. No get / set i obter / definir o estado de visualização para o controle - essa parte é fácil, mas quando o controle é preenchido através do javascript, o get texto não é realmente chamado, o que é a maneira correta para definir essa propriedade exposta usando JavaScript (ou mesmo se o usuário apenas tipos na caixa)?
Edit: No OnInit i garantir o estado é mantido pela alcançando os valores do formulário.
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (HttpContext.Current.Request.Form["MyInputBoxValue"] != "")
{
ViewState["MyInputBoxValue"]
= HttpContext.Current.Request.Form["MyInputBoxValue"];
}
}
Depois de obter o valor realmente de volta no lugar no HtmlTextWrite, eu faço o seguinte:
protected override void RenderContents(HtmlTextWriter output)
{
// There is an input control here and i set its value property
// like this using the Text internal defined.
output.Write("<input value=" + Text + ">.....
}
graças
Solução
Acho usando IStateManager funciona melhor.
Por exemplo:
partial class MyControl : System.Web.UI.UserControl, IStateManager
{
[Serializable()]
protected struct MyControlState
{
public bool someValue;
public string name;
}
protected MyControlState state;
public bool someValue {
get { return state.someValue; }
set { state.someValue = value; }
}
public bool IsTrackingViewState {
get { return true; }
}
protected override void LoadViewState(object state)
{
if ((state != null) && state is MyControlState) {
this.state = state;
}
}
protected override object SaveViewState()
{
return state;
}
protected override void TrackViewState()
{
base.TrackViewState();
}
}
getDefaultState () seria apenas carregar alguns padrões sãs em uma nova estrutura estatal. Estado deixa Rastreada no viewstate da página, e ASP vai cuidar de trazê-lo in / out para você.
(acima de código portado do VB e não marcado, espero que eu não fazer quaisquer erros, mas deve obter o ponto de qualquer jeito)
Outras dicas
Se você precisa manter o estado no postback, você deve fornecer seus próprios métodos de gravar o que o usuário tem feito com seu controle no lado do cliente e atualizar o controle de servidor mais tarde no servidor com as mudanças, ou refazer as alterações no lado do cliente quando a página é atualizada.
Hmm Eu me pergunto se podemos usar a existente ASP.NET persistência ... tentar herdar a partir do controle persistindo mais básico estado pós-back (estou pensando asp: oculto). Em seguida, basta substituir o render e adicionar todo o jazz quiser.
Deixe-me saber se ele funciona, então eu não vou ter de testar:)