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;
答案 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">
每当在控件上存储数据时,请记住它们必须保留在页面上。如果您只是声明一个变量,则无法保证数据在请求之间保持不变。确保数据持久化的唯一方法是将其保存在视图状态中。您可以找到对这些语句here和here的支持。
为什么IIS和Visual Studio中的行为更改可能与此无关,因为如上所述简单地声明变量并不能保证数据将被保存。
关于属性是getter / setter,请注意必须如上所示声明它,以便ASPX页面能够识别属性。