在UserControl中初始化类成员

时间:2014-07-17 02:39:09

标签: c# asp.net .net

Class派生自Asp.Net C#中的Control。

公共类成员定义为:

    public bool isPresent = true;

然后在Render方法中执行检查:

    if (isPresent)
       doSomething;

在表单上,​​此字段设置为false:

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

当这个代码从VS本地执行时,一切都很好。但是,部署到服务器会引发行的异常,并检查&#34; if(isPresent)&#34;,表示未设置对象引用。

同时,如果此行被更改为&#34; if(isPresent == true)&#34;,本地和服务器上的一切都很好。

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

更新:正如已经正确指出的那样,这个变量是一个字段,而不是一个属性。没有其他类成员(并且没有具有相同名称的属性)。

UPDATE2:此外,如果添加了检查值为非null,则不再有例外。在明确的比较操作的情况下,对象初始化器是否可以设置字段的值?

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

1 个答案:

答案 0 :(得分:1)

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

public bool IsPresent
{
    get 
    {
        bool isPresent = false;
        if (ViewState["IsPresent"] != null)
        {
            isPresent = (bool) ViewState["IsPresent"];
        }
        return isPresent;
    }
    set
    {
        ViewState["IsPresent"] = value;
    }
}

然后,控件将声明如下(请注意,IsPresent以Upper I开头):

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

每当在控件上存储数据时,请记住它们必须保留在页面上。如果您只是声明一个变量,则无法保证数据在请求之间保持不变。确保数据持久化的唯一方法是将其保存在视图状态中。您可以找到对这些语句herehere的支持。

为什么IIS和Visual Studio中的行为更改可能与此无关,因为如上所述简单地声明变量并不能保证数据将被保存。

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