Pergunta

Eu estou fazendo um quadro formulários para um projeto, e descobriram que ao tentar definir programaticamente o AssociatedControlID do asp: Label ao seu TextBox associado, eu tenho que chamar ClientID para obter ID para preencher (não ser nulo).

Durante a depuração, este uso da janela mostra intermediários a questão:

_inputTextBox.ID
null
_inputTextBox.ClientID
"ctl00_MainContent_ctl01"
_inputTextBox.ID
"ctl01"

(Value está presente 2ª vez ID é chamado)

Eu estou definindo _inputLabel.AssociatedControlID = _inputTextBox.ID em uma substituído CreateChildControls () , e de ter tentado em RenderContents () de meu WebControl.

Carregando

Eu tentei ClientID em uma variável temporário não utilizado em primeiro lugar, e ele funciona, por exemplo:

var x = _inputTextBox.ClientID;
_inputLabel.AssociatedControlID = _inputTextBox.ID;

Dá: (correto)

<label for="ctl00_MainContent_ctl01">Name of customer</label>
<input type="text" id="ctl00_MainContent_ctl01" name="ctl00$MainContent$ctl01"/>

Em vez de: (incorreta)

<span>Name of customer</span>
<input type="text" id="ctl00_MainContent_ctl01" name="ctl00$MainContent$ctl01"/>

A minha pergunta é - Por que eu tenho para realizar esse truque? Existe uma maneira melhor para ID para ser confiavelmente povoada?

Graças.

Foi útil?

Solução

A melhor coisa a fazer é definir o id do controle-se. Se você não faz um será automaticamente gerado quando os controles método EnsureID protegido é chamado.
Este método é chamado automaticamente em vários momentos, incluindo, mas não limitado a, quando o getter para ClientID é acessado.
Você também deve estar ciente de que se você estiver manipulando dinamicamente controles, então é possível que os ids gerados dinamicamente pode variar de acordo com a ordem em que você adiciona os controles para a página.
Além disso, mesmo se você não está criando dinamicamente os controles do id gerado dinamicamente pode variar se você forçar a geração id (acessando ClientID) em uma ordem diferente.

Outras dicas

O ID de controles criados dinamicamente é nula a menos que explicitamente definido até que o método RenderControl é chamado.

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