Вызов свойства или функции-члена строкового объекта внутри ListView - PullRequest
0 голосов
/ 09 ноября 2011

У меня возникли проблемы с вызовом свойства или метода для объекта строки с привязкой к данным внутри 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 все работает нормально. Если я оставлю это там, мой код выдаст «Ссылка на объект не установлена ​​для экземпляра объекта». исключение в строке, где я вызываю метод DataBind () для ListView в моем коде позади. То же самое происходит и с .ToLower ().

EDIT

Думаю, я понял это. Спасибо тем из вас, кто предложил перенести это в метод из кода, чтобы помочь с отладкой. Проблема была связана с нулевой ссылкой ... пойди разберись :) Я думал, что если строка таблицы не видна, то ни одна из логики внутри не будет оценена, но я думаю, что из-за того, что она связана с данными, логика все равно оценили. Таким образом, просто изменив вышеприведенную строку на следующую, мы решили проблему:

<%# Eval("Phone") != null && ((string)Eval("Phone")).Length == 4 %>'>

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Переместить составной код в метод code-behind. Например,

'<%# ((string)Eval("Phone")).Length == 4 %>'

становится

'<%# IsPhoneSpanVisible( (string)Eval( "Phone" ) ) %>'

с

protected bool IsPhoneSpanVisible( string Phone )
{
   // provide your logic here
}

Таким образом, вы легко сможете отладить свой код.

1 голос
/ 09 ноября 2011

Я бы рассмотрел использование 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;    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...