Почему мой ретранслятор продолжает падать на значениях Eval (NULL) - PullRequest
1 голос
/ 25 февраля 2009
<asp:Repeater ID="rptLessons" runat="server">
    <ItemTemplate>
        <tr>

            <td><%#Eval("fullname")%></td>
            <td><%#isCompleted(Eval("totallessons"), Eval("completedlessons"), Eval("totalNumAvail"), Eval("totalNumCorrect"))%></td>
            <td><%#FormatPercent(Eval("totalnumcorrect") / Eval("totalNumAvail"))%> <%-- (<%#Eval("totalnumcorrect")%> / <%#Eval("totalNumAvail")%>) --%></td>
            <td><%#FormatPercent(Eval("completedlessons") / Eval("totallessons"))%> <%-- (<%#Eval("completedlessons")%> / <%#Eval("totallessons")%>) --%></td>
            <td><%#Eval("lastaccessed")%></td>
        </tr>
    </ItemTemplate>
   </asp:Repeater>

Я не могу понять это, но как только он достигает НЕДЕЙСТВИТЕЛЬНЫХ данных, он отказывается переходить к рисованию следующих элементов.

Ответы [ 4 ]

1 голос
/ 25 февраля 2009

Вы должны дать трассировку стека, чтобы быть уверенным.

Но я вижу несколько проблем:

  1. DIV # 0 ошибок внутри FormatPercent
  2. NULL ошибки.

Пример решения

(System.Convert.ToInt32 должен преобразовать DBNull / NULL в 0)

Или измените isCompleted, чтобы принять параметры объекта и выполнить проверку NULL / DBNull внутри функции.

1 голос
/ 25 февраля 2009

При немного ином подходе, который может быть полезен, можно было бы выполнять вычисления в коде, а не в строке в разметке. Просто проще проверить на нулевые значения и т. Д. Я почти всегда иду по этому пути с чем-нибудь, кроме простого Eval () в моей разметке.

<td>
    <%#GetCorrectPercent()%>
</td> 

protected string GetCorrectPercent()
{
    if(Eval("totalnumcorrect") == null || Eval("totalNumAvail") == null)
        return "n/a";

    return ((int)Eval("totalnumcorrect") / (int)Eval("totalNumAvail")).ToString();
}

Не уверен, что все форматирование здесь правильно, но это должно заставить вас двигаться в другом направлении. Eval () будет работать в вызываемых методах, пока вызывающий в данный момент выполняет DataBind ().

0 голосов
/ 25 февраля 2009

Я склоняюсь больше к явному. Простите за незначительные ошибки в коде, я не могу это проверить.

Если в разметке вы заменяете эти уловки на литералы, то в коде:

Если у вас есть коллекция MyClass.

В событии инициализации вашей страницы

this.rptLessons.OnItemDataBound += rptLessons_DataBound...

В нагрузке или где бы вы ни выбрали

this.rptLessons.DataSource = CollectionOfMyClass;
this.rptLessons.DataBind();

Тогда в этом элементе DataBoundEvent

MyClass myClass = (MyClass)ri.DataItem;
Literal litFullname = FindControl(ri, "litFullName");
litFullName.Text = myClass.Fullname;

Таким образом, вы можете обслуживать нули и т. Д. Более контролируемым образом, чем при использовании eval.

0 голосов
/ 25 февраля 2009

Если бы мне пришлось угадывать, я бы сказал, что ваша isCompleted функция не обрабатывает значения Nothing Это предположение, потому что функция не была указана в вашем примере.

...