在ListView中调用字符串对象的属性或成员函数

时间:2011-11-09 18:48:26

标签: asp.net string listview

我在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 %>'>

2 个答案:

答案 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
}

这样您就可以轻松调试代码。