初始化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;
在创建用户控件时,最可取的方式是在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页面识别