I pode negar o valor em um atributo que usa um “Eval”?
-
03-07-2019 - |
Pergunta
Eu gostaria de definir o estado habilitado de um botão para ser a negação de um valor.
Assim, dado este código:
<asp:CheckBox ID="DefaultChecked"
Checked='<%# Bind("IsDefaultMessage") %>'
Enabled="false"
runat="server" />
<asp:LinkButton ID="MakeDefaultButton"
runat="server"
CommandName="MakeDefault'
CommandArgument='<%# Bind("ResidentialInfoID") %>'
Text="Make Default" />
Como posso fazer o Enabled
LinkButton atributo false
se IsDefaultMessage == true
?
Solução
Use Eval vez de Bind. Bind é para a ligação de duas vias, ou seja, para os casos em que você precisa para ser capaz de salvar a parte de trás de dados para a sua fonte de dados.
Quando você usa Bind, a página compilada vai realmente ter gerado o código que usa Eval para definir o valor, mais algum código para ler o valor para a poupança. Porque Bind é substituído por código gerado, você não pode usar qualquer lógica extra com Bind.
<asp:CheckBox ID="DefaultChecked" Checked='<%# !(bool)Eval("IsDefaultMessage") %>' Enabled="false" runat="server" />
<asp:LinkButton ID="MakeDefaultButton" runat="server" CommandName="MakeDefault' CommandArgument='<%#Bind("ResidentialInfoID") %>' Text="Make Default"/>
Outras dicas
Se você pode usar Eval, é apenas um método da classe Control
. É apenas especial em que ele precisa ser no contexto de um <%# ... %>
bloco ligado a dados. Fora isso, você pode basicamente tratar o bloco como um bloco de expressão <%= %>
regulares:
<%# !(bool)Eval("IsDefaultMessage") %>
Se você quiser ainda vinculá-lo (Eval não é de ida e volta), do que você vai precisar para negá-lo e para trás durante a ligação de dados. Você pode não precisar de fazer isso, porém, se você pode simplesmente re-palavra de controle. Por exemplo, se uma caixa de seleção, em vez de rotulá-lo "não é Mensagem Padrão" para o usuário e negando frente e para trás, que lable-lo "é a mensagem padrão". exemplo inventado, mas você começa a idéia.
Eu nunca usei Bind mas o meu entendimento é que ele é semelhante ao DataBinder.Eval. De qualquer maneira, ambos os métodos retornam objetos que você precisa convertê-lo para um booleano antes de avaliá-lo.
<%# !Convert.ToBoolean(Bind("IsDefaultMessage") %>
Editar: parece que isso não pode ser feito e usando um SqlDataSource na página resolveria o problema. http://forums.asp.net/t/1009497.aspx .
No caso de alguém está à procura de uma opção com VB.Net
<asp:CheckBox ID="DefaultChecked" Checked='<%# NOT (Eval("IsDefaultMessage")) %>' Enabled="false" runat="server" />
Se bem me lembro (Tem sido um tempo), não há nenhuma mágica especial em <%#Bind(
. É apenas dentro #Bind(
<% ....%>. Que significa que você iria querer:
<% ! #Bind("IsDefaultMessage") %>'
O código
Checked='<%# Eval("IsDefaultMessage").ToString().Length() > 4 %>'
retornará verdadeiro se IsDefaultMessage é falsa Desde "False" .Length = 5 e "True" .Length = 4