Asp.net 为什么我的中继器总是在Eval(NULL)值上崩溃?

Asp.net 为什么我的中继器总是在Eval(NULL)值上崩溃?,asp.net,null,repeater,Asp.net,Null,Repeater,我无法理解,但一旦它遇到一些空数据,它就会拒绝继续绘制下一个元素。如果我不得不猜测,我会说您的isCompleted函数不会处理空值。这是一个猜测,因为您的示例中没有列出该函数。您需要提供堆栈跟踪以确保 但我可以看到几个问题: DIV#0格式百分比内的错误 空错误 示例解 (System.Convert.ToInt32应将DBNull/NULL转换为0) 或者将isCompleted更改为接受对象参数,并在函数内部执行NULL/DBNull检查。在稍微不同的方法中,可能会有帮助的是在代码中进行计

我无法理解,但一旦它遇到一些空数据,它就会拒绝继续绘制下一个元素。

如果我不得不猜测,我会说您的isCompleted函数不会处理空值。这是一个猜测,因为您的示例中没有列出该函数。

您需要提供堆栈跟踪以确保

但我可以看到几个问题:

  • DIV#0格式百分比内的错误
  • 空错误
  • 示例解

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


    或者将isCompleted更改为接受对象参数,并在函数内部执行NULL/DBNull检查。

    在稍微不同的方法中,可能会有帮助的是在代码中进行计算,而不是在标记中内联。只是更容易检查空值等。我几乎总是在标记中使用除简单Eval()之外的任何东西

    <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>
    
    
    受保护的字符串GetCorrectPercent()
    {
    如果(Eval(“totalnumcorrect”)==null | | Eval(“totalNumAvail”)==null)
    返回“不适用”;
    return((int)Eval(“totalnumcorrect”)/(int)Eval(“totalNumAvail”)).ToString();
    }
    

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

    我更倾向于显式。请原谅代码中的任何小错误,我无法测试它

    如果在标记中,您将这些eval替换为文字,那么在代码隐藏中:

    如果您有MyClass的集合

    在页面的init事件中

    <td>
        <%#GetCorrectPercent()%>
    </td> 
    
    protected string GetCorrectPercent()
    {
        if(Eval("totalnumcorrect") == null || Eval("totalNumAvail") == null)
            return "n/a";
    
        return ((int)Eval("totalnumcorrect") / (int)Eval("totalNumAvail")).ToString();
    }
    
    在负载中或您选择的任何位置

    this.rptLessons.OnItemDataBound += rptLessons_DataBound...
    
    然后在那个itemdatabound事件中

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

    通过这种方式,您可以以比使用eval更可控的方式处理空值等问题。

    man我对这一点很有希望,但它仍然没有绘制,它绘制了包含空值的数据行的名字,但没有绘制其他数据行,并且在这一行之后也没有绘制更多的中继器……打开跟踪,看看结果如何报告的异常为。zyou可能在isCompleted内部失败(例如在DIV#0上),而不是现在的空引用问题。后面的代码是否能够看到Eval(“totalnumcorrect”)或我是否必须将其传递过来,我不明白它将如何看到…将工作,但只有在DataBind()操作期间调用GetCorrectPercent()方法时才会工作。在DataBind()之外调用它将导致异常。Ryan,请注意,这种方法不会直接解决您的问题,但是检查空值和用户使用的更复杂的逻辑(标记中包含所有格式)要容易得多你说它崩溃了,但确切的错误是什么?我看不到任何错误。它只是无法完成填充其余的数据。使用ASP.NET数据绑定周围的HTML注释并不能阻止数据绑定的发生。它只是将结果放入呈现页面的HTML注释中。你需要移除它。
    MyClass myClass = (MyClass)ri.DataItem;
    Literal litFullname = FindControl(ri, "litFullName");
    litFullName.Text = myClass.Fullname;