ASP.Net: Os controles de usuário adicionado ao espaço reservado dinamicamente não é possível recuperar valores

StackOverflow https://stackoverflow.com/questions/102483

  •  01-07-2019
  •  | 
  •  

Pergunta

Estou adicionando alguns controles de usuário dinamicamente para um controle de servidor PlaceHolder. Meu controle do usuário consiste em alguns rótulos e alguns controles caixa de texto.

Quando eu enviar o formulário e tentar visualizar o conteúdo das caixas de texto (dentro de cada controle do usuário) no servidor, eles estão vazios.

Quando os concluída postagem, as caixas de texto têm os dados que entraram antes de postback. Isso me diz que o texto nas caixas estão sendo retidos por meio de ViewState. Eu só não sei por que eu não posso encontrá-los quando estou de depuração.

Alguém por favor pode me dizer por que eu não estaria vendo os dados inseridos pelo usuário no servidor?

Obrigado por qualquer ajuda.

Foi útil?

Solução

Isto é baseado em .NET v1 seqüência de eventos, mas deve dar-lhe a idéia:

  • Inicializar (evento Init)
  • começar a acompanhar View State (verifica se postback)
    • Load View State (se postback)
    • Load Postback de dados (se postback)
  • Carga (Load evento)
    • Aumentar Mudou Eventos (se postback)
    • Aumentar Postback Eventos (se postback)
  • PreRender (evento PreRender)
  • Save View State
  • Render
  • Unload (evento Unload)
  • Elimine

Como você pode ver, o carregamento de ViewState dados de volta para os controles acontecer antes do evento Load. Portanto, para que seus controles dinamicamente adicionados ao "reter" esses valores, eles têm que ser presente para a página ASP.NET para recarregar os valores em primeiro lugar. Você teria que recriar os controles na fase de inicialização, antes de Carga View State ocorre.

Outras dicas

Eu descobri ontem que você pode realmente fazer o seu trabalho app como normal, carregando a árvore de controle logo após a loadviewstateevent é acionado. se você substituir o evento LoadViewState, mybase.loadviewstate chamada e, em seguida, colocar o seu próprio código para regenerar os controles logo depois, os valores para os controles estarão disponíveis no carregamento da página. Em um dos meus aplicativos que eu use um campo viewstate para manter a identidade ou a informação matriz que pode ser usado para recriar esses controles.

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub

Eu acredito que você vai precisar adicionar o UserControl para o espaço reservado durante a fase de inicialização do ciclo de vida da página, a fim de obter o ViewState a ser preenchido pela fase de carga para ler esses valores. esta é a ordem em que você está carregando esses?

Certifique-se de que você está definindo seus controles dinâmicos no nível da classe e adicioná-los ao recipiente ASP:

Private dynControl As ASP.MyNamespace_MyControl_ascx

E quando você instanciar o controle, certifique-se de chamar LoadControl de modo que o objeto é adicionado corretamente:

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)

Você tem que criar seus controles no manipulador de eventos Page_PreInit. O modelo de controle de servidor ASP.NET é complicado; você tem que entender completamente o href="http://msdn.microsoft.com/en-us/library/ms178472.aspx" página ciclo de vida para fazê-lo direito.

Como já foi dito, qualquer forma de manipulação de controle deve ser feito antes de viewstate é criado.

Aqui está um bom link sobre o ciclo de vida de página para ajudá-lo:

http://msdn.microsoft.com/en-us/library /ms178472.aspx

Temos experimentado a mesma coisa e ter lidado com isso usando controles fantasma na page_load que têm exatamente o mesmo .ID e, em seguida, as picaretas enviar de volta para cima os eventos e os dados. Como outros disseram que é a dinâmica adição do controle após as etapas de inicialização que o Estado está já construídas e controles adicionados depois não são armazenados.

Espero que isso ajude um pouco.

Eu também quero acrescentar que eu vi controles de usuário funcionar da maneira que você esperaria que apenas definindo a propriedade Control.ID em tempo de execução. Se você não definir a ID, itens podem obter construído em uma ordem diferente e trabalhar de forma estranha.

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