当存在值时,asp.net null引用错误将值赋给对象

时间:2013-12-02 21:52:18

标签: c# asp.net

我有一个使用强类型对象的搜索页面,但我将值分为特定组。

代码隐藏页面在用户单击搜索按钮时调用以下内容(这些字段均不为空):

SearchCriteria sc = new SearchCriteria();

sc.Generic.id = txtId.Text;
sc.Generic.maxReturned = rblMaxReturned.SelectedIndex;
sc.DisplayOnly.category = txtCategory.Text;
sc.DisplayOnly.type = txtType.Text;
sc.Building.address = txtAddress.Text;
sc.Building.city = txtCity.Text;

DataType文件的定义如下:

[Serializable]
public class SearchCriteria 
{
    public _Generic Generic { get;set; }
    [Serializable]
    public class _Generic 
    {
        public int id {get;set;}
        public int maxReturned {get;set;}
    }

    public _DisplayOnly DisplayOnly { get;set; }
    [Serializable]
    public class _DisplayOnly 
    {
        public int category {get;set;}
        public int type {get;set;}
    }

    public _Building Building { get;set; }
    [Serializable]
    public class _Building 
    {
        public int address {get;set;}
        public int city {get;set;}
    }
}

当代码执行时,即使各个文本框中的所有项都有值,我也会得到nullreferenceerror。但是,如果我拿出公共_Building Building {get; set;并直接调用它,它可以工作并填充值。什么是最好的解决方案?我不应该使用中间定义并直接调用该类吗?如果是这样,如何在不对页面后面的代码进行四次不同调用的情况下调用不同的组?

2 个答案:

答案 0 :(得分:1)

您需要初始化内部类实例。简单地声明变量并不意味着您可以在不创建实例的情况下访问其属性。您可以在SearchCriteria

的构造函数中轻松完成此操作
[Serializable]
public class SearchCriteria 
{
    public SearchCriteria()
    {
         // Without these initialization the internal variables are all null
         // and so assigning any property of a null object causes the error
         Generic = new _Generic();
         DisplayOnly = new _DisplayOnly()
         Building = new _Building();
    }
    .....
}

答案 1 :(得分:0)

当您创建SearchCriteria类的新实例时,属性不会初始化,因此它们的值都为null。现在看一下您尝试使用其中一个属性的第一行:

sc.Generic.id = txtId.Text;

此处txtID.Text完全正常,但sc.Genericnull。当您尝试查找它的.id属性以进行分配时,会抛出异常。

要解决此问题,您需要初始化每个属性以获得其类型的实例。此外,使用私有集可能是个好主意,如下所示:

public _Generic Generic { get;private set; }

这仍然允许进行当前写入的所有相同分配,因为这只需要get操作来检索类型实例。赋值/设置操作属于属性的属性。