2009-03-04 69 views
12

我想将按钮的启用状态设置为值的否定。我可以否定使用“Eval”的属性中的值吗?

所以给出这样的代码:

<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" /> 

我怎样才能让LinkBut​​ton的Enabled属性false如果IsDefaultMessage == true

回答

20

使用Eval代替Bind。绑定用于双向绑定,即用于需要将数据保存回数据源的情况。

当您使用绑定时,编译后的页面实际上会生成使用Eval设置值的代码,并加上一些代码来读出保存的值。因为绑定被替换为生成的代码,所以不能在绑定中使用任何额外的逻辑。

<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"/> 
-1

正如我记得(这是一段时间),<%#Bind(没有什么特别的魔法。这只是#Bind(里面<%....%>。这意味着你会想:

<% ! #Bind("IsDefaultMessage") %>' 
+0

这将无法正常工作... <%#...%>让ASP.NET知道它是在数据绑定过程中发生......!必须在#之后去。 – 2009-03-04 15:41:16

5

如果你可以使用eval,它只是一个Control类的方法。它的唯一特别之处在于它需要位于数据绑定块<%# ... %>的上下文中。除此之外,你基本上可以把块像一个普通的<%= %>表达式块:

<%# !(bool)Eval("IsDefaultMessage") %> 

如果你想还是把它绑定(EVAL不是往返),比你需要否定回数据绑定期间。如果你可以重新命名控制权,你可能不需要这样做。例如,如果使用复选框而不是将其标记为“不是默认消息”并且将其反向否定,而不是将其标记为“默认消息”。有争议的例子,但你明白了。

+0

这样做会引发“无效的预处理器指令节点”错误。任何想法如何解决? – KevDog 2009-03-04 15:47:35

+0

另外,“不能将运算符应用于类型对象的操作数” – KevDog 2009-03-04 15:49:01

1

我从来没有使用绑定,但我的理解是它与Databinder.Eval类似。无论哪种方式,两种方法都会返回对象,因此您需要在评估之前将其转换为布尔值。

<%# !Convert.ToBoolean(Bind("IsDefaultMessage") %> 

编辑:看起来像这样做不能完成,并使用页面上的SqlDataSource将解决问题。 http://forums.asp.net/t/1009497.aspx

-1

的代码,如果IsDefaultMessage是假

Checked='<%# Eval("IsDefaultMessage").ToString().Length() > 4 %>' 

将返回true 由于 “假”。长度= 5, “真”。长度= 4

1

万一有人找一个选项与VB.Net

<asp:CheckBox ID="DefaultChecked" Checked='<%# NOT (Eval("IsDefaultMessage")) %>' Enabled="false" runat="server" /> 
相关问题