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

Foi útil?

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:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top