关于c#:将空值绑定到Web用户控件的属性

关于c#:将空值绑定到Web用户控件的属性

Binding a null value to a property of a web user control

在一个稍微复杂的页面上工作,以配置工作中的客户。设置是有一个主页,其中包含用于各种设置组的各种"面板"。

在一种情况下,主表上有一个电子邮件地址字段,并且有一个"导出"配置来控制如何发送电子邮件。我创建了一个选择公司的主面板,并绑定到FormView。 FormView包含一个Web用户控件,用于处理导出详细信息的显示/配置。

Web用户控件包含一个属性,该属性定义应处理的Config,并使用Bind()从FormView中获取值。

基本上,控件是这样使用的:

1
<syn:ExportInfo ID="eiConfigDetails" ExportInfoID='<%# Bind("ExportInfoID" ) %>' runat="server" />

被绑定的属性在CodeBehind中这样声明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public int ExportInfoID    
{
    get
    {
        return Convert.ToInt32(hfID.Value);
    }
    set
    {
        try
        {
            hfID.Value = value.ToString();
        }
        catch(Exception)
        {
            hfID.Value="-1";
        }
    }
}

每当ExportInfoID为null时,我都会得到一个null引用异常,但是最重要的是,它实际上是在尝试设置属性之前发生的(否则它将在此版本中被捕获。)

任何人都知道发生了什么,或更重要的是,如何解决它……?


在hfID上使用Null Object设计模式

http://www.cs.oberlin.edu/~jwalker/nullObjPattern/


绑定不能将null值转换为int值,以设置ExportInfoID属性。 这就是为什么它不会陷入您的代码中的原因。 您可以将属性设置为可为null的类型(int?),也可以在绑定逻辑中处理null。

所以会是这样的

1
2
3
bind receives field to get value from
bind uses reflection to get the value
bind attempts to set the ExportInfoID property // boom, error


似乎是因为hfID.Value尚未初始化为值,所以无法转换。 您可能想在您的吸气剂中添加一个空检查或进行某些验证,以确保hfID.Value不为空且为数字。


推荐阅读