初始化UserControl中的类成员

本文关键字:成员 UserControl 初始化 | 更新日期: 2023-09-27 18:13:26

类派生自Asp中的控件。净c#。

公共类成员定义为:

    public bool isPresent = true;

然后在渲染方法检查执行:

    if (isPresent)
       doSomething;

在表单中此字段被设置为false:

    <c:CustomControl id="CustomControl1" isPresent="false">

当这段代码从VS本地执行时,一切都很好。然而,当部署到服务器时,会为检查"if (isPresent)"的行抛出异常,表示未设置对象引用。

同时,如果这一行被改为"if (isPresent == true)",本地和服务器上的一切都没问题。

从VS和IIS运行时,控件的类成员的值设置是否不同?它是在比较操作之前在IIS中初始化,而不是在隐式检查之前?

UPDATE:正如正确指出的那样,这个变量是一个字段,而不是一个属性。没有其他类成员(也没有同名的属性)。

UPDATE2:另外,如果添加了value不为空的检查,则不再有异常。对象初始化器可以在显式比较操作的情况下设置字段的值吗?

    if (isPresent == null)
       return;
    if (isPresent)
       doSomething;

初始化UserControl中的类成员

在创建用户控件时,最可取的方式是在viewstate中存储属性值,如下所示:

public bool IsPresent
{
    get 
    {
        bool isPresent = false;
        if (ViewState["IsPresent"] != null)
        {
            isPresent = (bool) ViewState["IsPresent"];
        }
        return isPresent;
    }
    set
    {
        ViewState["IsPresent"] = value;
    }
}
然后,控件声明如下(注意IsPresent以大写I开头):
<c:CustomControl id="CustomControl1" IsPresent="false">

无论何时在控件上存储数据,请记住它们必须持久化在页面上。如果仅仅声明一个变量,则不能保证数据在请求之间保持不变。确保数据持久化的唯一方法是将其保存在viewstate中。你可以在这里和这里找到对这些语句的支持。

为什么IIS和Visual Studio中的行为变化的问题在这里可能不相关,因为简单地声明一个变量,如上所述,不能保证数据将被保存。

关于属性是getter/setter,请注意它必须如上所示声明,以便属性被ASPX页面识别