我在checkboxlist用户控件中有一组7个复选框。我在selectedIndexchanged事件中为选中的框构建一个字符串,传递给ViewState,然后将ViewState传递给Property。我这样做是因为在没有选中复选框的情况下我想处理null。问题是无论我如何检查null,系统都会抛出对象引用错误。如果选中至少一个复选框但如果未选中任何复选框,则此当前设置可正常工作。我如何检查null?我应该在属性或主机aspx页面中检查null吗?
我已经研究了不同的方法来做到这一点,我尝试了很多。我的想法是使用IsNullOrEmpty
或IsNullOrWhiteSpace
将是正确的方法,但两个都没有工作。
用户控件类 - 全局变量
private string _daysOffInputString = string.Empty;
用户控制属性
public string DaysOffSelectedValues
{
get
{
if (string.IsNullOrEmpty(ViewState["DaysOff"].ToString()))
{
_daysOffInputString = string.Empty;
}
else
{
_daysOffInputString = ViewState["DaysOff"].ToString();
}
return _daysOffInputString;
}
set { _daysOffInputString = value; }
用户控制事件
protected void CbDaysOff_SelectedIndexChanged(object sender, EventArgs e)
{
CheckBoxList chkbx = (CheckBoxList)sender;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < chkbx.Items.Count; i++)
{
if (chkbx.Items[i].Selected)
{
sb.Append(chkbx.Items[i].Text + ", ");
}
if (!String.IsNullOrEmpty(sb.ToString()))
{
//Remove last comma & space from string
_daysOffInputString = sb.ToString().Substring(0, sb.ToString().Length - 2);
}
else
{
_daysOffInputString = string.Empty;
}
}
ViewState["DaysOff"] = _daysOffInputString;
}
aspx页面 - 我在其中检索uc属性值的片段:
case 2:
blnFlag = false;
ucDaysOff uc3 = row.Cells[3].FindControl("ucDaysOff3") as ucDaysOff;
strAnswer = uc3.DaysOffSelectedValues; //e.g. "Sat, Sun"
break;
解决方案:在用户控件属性DaysOffSelectedValues
中,我在检查null之前将ViewState["DaysOff"]
转换为字符串,这是问题所在。以下是有效的代码:
public string DaysOffSelectedValues
{
get
{
if (ViewState["DaysOff"] == null)
{
//_daysOffInputString = string.Empty; }
_daysOffInputString = "Nothing to see here.";
}
else
{
_daysOffInputString = ViewState["DaysOff"].ToString();
}
return _daysOffInputString;
}
set { _daysOffInputString = value; }
}
答案 0 :(得分:0)
在使用之前,应始终检查对象(在本例中为ViewState)是否为null。可以说ViewState["DaysOff"]
尚未创建或已被删除。
然后这会抛出一个空引用:
string str = String.IsNullOrEmpty(ViewState["DaysOff"].ToString());
因为您没有检查ViewState对象是否为null,而是它应该保留的字符串。
这样做
if (ViewState["DaysOff"] != null)
{
string str = ViewState["DaysOff"].ToString();
}