为什么我的转发器会继续崩溃Eval(NULL)值?

时间:2009-02-25 03:11:35

标签: asp.net null repeater

<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>

我无法弄清楚但是只要它遇到一些NULL数据就会拒绝继续绘制下一个元素。

4 个答案:

答案 0 :(得分:1)

您需要确保堆栈跟踪。

但我可以看到几个问题:

  1. FormatPercent
  2. 中的DIV#0错误
  3. NULL错误。
  4. 示例解决方案

    (System.Convert.ToInt32应将DBNull / NULL转换为0)

    或者更改isCompleted以接受Object参数并在函数内部执行NULL / DBNull检查。

答案 1 :(得分:1)

稍微不同的方法可能有助于在代码中进行计算,而不是在标记中内联。更容易检查空值等。除了我的标记中的简单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();
}

不确定这里的所有格式都是正确的,但这会让你朝不同的方向前进。只要调用者当前正在执行DataBind(),Eval()将在被调用的方法中工作。

答案 2 :(得分:0)

如果我不得不猜测,我会说你的 isCompleted 函数不处理 Nothing 的值。这是猜测,因为您的示例中未列出该函数。

答案 3 :(得分:0)

我更倾向于明确。 原谅代码中的任何小错误,我无法对此进行测试。

如果在你的标记中你用文字替换那些文字,那么在后面的代码中:

如果您有MyClass的集合。

在您网页的初始化事件中

this.rptLessons.OnItemDataBound += rptLessons_DataBound...

在负载中或您选择的地方

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

然后在那个itemDataBoundEvent

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

通过这种方式,您可以以比使用eval更受控制的方式来满足空值等。