题 我可以否定使用“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


12
2018-03-04 15:23


起源




答案:


使用Eval而不是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"/>

21
2018-03-05 11:30





如果你可以使用Eval,它只是一种方法 Control 类。它的特殊之处在于它需要位于数据绑定块的上下文中 <%# ... %>。除此之外,您基本上可以像常规一样对待块 <%= %> 表达式块:

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

如果你想仍然绑定它(Eval不是往返),那么你需要在数据绑定期间来回否定它。如果你可以重新控制控件,你可能不需要这样做。例如,如果选中一个复选框,而不是将“不是默认消息”标记给用户并反复否定它,而不是将其标记为“是默认消息”。举例说明,但你明白了。


5
2018-03-04 15:33



这样做会抛出“无效的预处理程序指令节点”错误。关于如何解决的任何想法? - KevDog
另外,“不能将operator!应用于类型对象的操作数” - KevDog
你是对的 - Bind不能像我一样使用它。我将其切换到Eval并描述了如何解决绑定使用问题。 - Jon Adams
另外,“不能将operator!应用于类型对象的操作数” - ch2o
@ ch2o:通过强制转换为正确的类型 - Jon Adams


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

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

编辑:看起来这样做无法完成,在页面上使用SqlDataSource可以解决问题。 http://forums.asp.net/t/1009497.aspx


1
2018-03-04 15:58



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


如果有人正在寻找VB.Net的选项

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

1
2017-07-14 08:46





我记得(已经有一段时间了),没有特别的魔力 <%#Bind(。只是 #Bind(  在里面<%....%>。这意味着你想要:

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

-1
2018-03-04 15:28



这不起作用...... <%#...%>让ASP.NET知道它在数据绑定期间发生......!必须去#。 - Jeff Martin


代码

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

如果IsDefaultMessage为false,则返回true 由于“False”.Length = 5和“True”.Length = 4


-1
2018-03-28 15:09