在aspx页面中错误消息“字符串未被识别为有效的布尔值”

时间:2013-11-14 15:09:09

标签: asp.net sql-server checkbox telerik radgrid

我有一个SQL存储过程,我根据另外两列动态创建一个列(“Certified”)。此列的值为“0”或“1”。 SQL存储的proc查询是:

, CASE WHEN 
    (StartMiles < EndMiles) 
    AND (StartTime < EndTime) 
    AND (bcd.Status != 'C')
     THEN '1' ELSE '0' END
     AS Certified

在我的aspx页面的前端,我有一个telerik radgrid,它将显示一个复选框(如果值为1则启用,如果值为0则禁用)。 aspx代码是:

<telerik:GridTemplateColumn DataField="Certified" HeaderText="Certified" Visible="true">
    <ItemTemplate>
        <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true" 
        OnCheckedChanged="CheckBox2_CheckedChanged" 
        Enabled='<%# !bool.Parse(Eval("Certified").ToString()) %>' />
    </ItemTemplate>
</telerik:GridTemplateColumn>  

我在aspx页面上收到错误字符串未被识别为有效的布尔
要解决该错误,如何在存储过程中设置数据类型?

2 个答案:

答案 0 :(得分:4)

<telerik:GridTemplateColumn DataField="Certified" HeaderText="Certified" Visible="true">
    <ItemTemplate>
        <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true" 
            OnCheckedChanged="CheckBox2_CheckedChanged" 
            Enabled='<%# !Convert.ToBoolean(Convert.ToInt32(Eval("Certified").ToString())) %>' />
    </ItemTemplate>
</telerik:GridTemplateColumn>

答案 1 :(得分:1)

我建议使用代码隐藏方法来执行此操作,而不是通过嵌入式代码块将逻辑放入标记中,如下所示:

标记:

<telerik:GridTemplateColumn DataField="Certified" HeaderText="Certified" 
                            Visible="true">
    <ItemTemplate>
        <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true" 
                    OnCheckedChanged="CheckBox2_CheckedChanged" 
                    Enabled='<%# IsCertified(Eval("Certified").ToString()) %>' />
    </ItemTemplate>
</telerik:GridTemplateColumn> 

代码隐藏:

protected bool IsCertified(string certifiedValue)
{
    return !bool.Parse(certifiedValue);
}

注意:为了更安全,我建议使用Boolean.TryParse()方法而不仅仅是Parse(),因为这样可以消除无法解析为bool的字符串的可能性从抛出异常。请阅读Boolean.TryParse Method documentation以获取更多信息。

在我看来,这提供了两个优于OP代码的优势:

  1. 简化标记,因为标记中没有条件逻辑,但现在只是调用方法。
  2. 您可以利用Visual Studio IntelliSense编译器的强大功能在编译时捕获语法错误,而不是运行时和调试器本身。