我在ListView内的数据绑定字符串对象上调用属性或方法时遇到了一些麻烦。见这个例子:
<asp:ListView runat="server" ID="FullInfoListView">
<LayoutTemplate>
<table class="tablestripe" width="100%">
<asp:Placeholder runat="server" ID="itemPlaceholder" />
</table>
</LayoutTemplate>
<ItemTemplate>
<tr valign="top" runat="server" Visible='<%# !string.IsNullOrEmpty((string)Eval("Phone")) %>'>
<td><strong>Phone:</strong></td>
<td><span runat="server" Visible='<%# ((string)Eval("Phone")).Length == 4 %>'>x</span><%# Eval("Phone") %></td>
</tr>
</ItemTemplate>
</asp:ListView>
这一行:
<%# ((string)Eval("Phone")).Length == 4 %>'>
是给我带来麻烦的。如果我删除.Length一切正常。如果我将它留在那里,我的代码会抛出“对象引用未设置为对象的实例”。在我的代码后面的ListView上调用DataBind()方法的行上的异常。 .ToLower()也会出现同样的行为。
修改
我想我弄明白了。感谢那些建议将其移至代码后面的方法以帮助调试的人。这个问题与null引用有关... go figure :)我认为如果表行不可见,里面的任何逻辑都不会被评估,但我认为由于它是数据绑定的逻辑是无论如何评估。因此,只需将上面的行更改为以下内容即可解决问题:
<%# Eval("Phone") != null && ((string)Eval("Phone")).Length == 4 %>'>
答案 0 :(得分:1)
我会考虑使用Label
代替<span>
。而不是将其转换为string
,而是使用ToString()
函数,并将整个表达式包装在括号中,以确保它作为布尔值进行评估:
<asp:Label ID="Label1" runat="server" Visible='<%# (Eval("Phone").ToString().Length >= 4) %>' Text="X" />
如果上述方法无法解决您的问题,您可以随后在后面的代码中添加一个方法来执行此操作:
<asp:Label ID="Label1" runat="server" Visible='<%# CheckLength(Eval("Phone").ToString()) %>' Text="X" />
代码隐藏:
public bool CheckLength(string value)
{
return value.Length >= 4;
}
答案 1 :(得分:1)
将复合代码移动到代码隐藏方法。例如
'<%# ((string)Eval("Phone")).Length == 4 %>'
变为
'<%# IsPhoneSpanVisible( (string)Eval( "Phone" ) ) %>'
与
protected bool IsPhoneSpanVisible( string Phone )
{
// provide your logic here
}
这样您就可以轻松调试代码。