Ter que chamar .ClientID para obter .ID para preencher para um controle web
-
05-07-2019 - |
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.
CarregandoEu 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.
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.