我能否否定使用“Eval”的属性中的值?

14

我想将一个按钮的启用状态设置为一个值的否定。

因此,考虑到以下代码:

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

如果IsDefaultMessage == true,我该如何使的Enabled属性为false

6个回答

24

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

当您使用Bind时,编译后的页面实际上会生成使用Eval设置值的代码,以及一些用于读取保存值的代码。因为Bind被替换为生成的代码,所以您无法在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"/>

6
如果您可以使用Eval,它只是Control类的一个方法。 它的特殊之处在于它需要在数据绑定块<%# ... %>的上下文中使用。 除此之外,您基本上可以像处理常规的<%= %>表达式块一样处理该块:
<%# !(bool)Eval("IsDefaultMessage") %>

如果您仍然想绑定它(Eval不是往返的),那么在数据绑定期间需要反复否定它。但是,如果您可以重新设计控件,则可能不需要这样做。例如,对于复选框,不要将其标记为“不是默认消息”并反复否定给用户,而是将其标记为“默认消息”。这只是一个虚构的例子,但您可以理解这个思路。


这样做会抛出一个“无效的预处理器指令节点”错误。有什么解决方法吗? - KevDog
另外,“无法将运算符!应用于类型为object的操作数” - KevDog
你是对的 - Bind 不能像我之前那样使用。我将其切换为Eval并描述了如何解决Bind使用的问题。 - Jon Adams
此外,"无法对类型为对象的运算数应用运算符!" - ch2o
@ch2o:通过转换为正确的类型进行修复 - Jon Adams

2

如果有人想使用VB.Net进行选项设置

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

1

我从未使用过Bind,但我的理解是它类似于Databinder.Eval。无论哪种方法,都会返回对象,因此在评估之前需要将其转换为布尔值。

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

编辑:看来这是做不到的,使用页面上的 SqlDataSource 将解决问题。http://forums.asp.net/t/1009497.aspx


这会抛出错误:“当前上下文中不存在'Bind'名称”。 - KevDog
你想使用Bind有什么原因吗?你尝试过使用DataBinder.Eval吗?<%# !Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "IsDefaultMessage")) %> - rmw
这是一个关于此问题的论坛:http://forums.asp.net/t/1009497.aspx。您能否在页面上添加SqlDataSource?看起来这可能会使它起作用。 - rmw

-1

据我回忆(已经有一段时间了),<%#Bind( 中没有特殊的魔法。它只是在<%....%>内部使用#Bind(。这意味着您需要:

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

这样行不通... <%#...%> 让 ASP.NET 知道它是在数据绑定期间进行的... ! 必须放在 # 后面。 - Jeff Martin

-1

代码

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

如果IsDefaultMessage为false,则返回true。 因为"False".Length = 5且"True".Length = 4


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接