2013-01-10 59 views
3

我可能在做一些愚蠢的事情,但找不到什么。我想在ASP.NET MVC修改简单的会员功能4.我稍微修改与模板来一个RegisterModel,并添加类别列表,以它像这样:将项目添加到列表中<T>

public class RegisterModel 
{ 
    ... 

    public List<SelectListItem> Categories { get; set; } 
} 

然后在账户控制器I “米试图将项目添加到这个列表,但得到‘Object reference not set to an instance of an object.’错误:

[AllowAnonymous] 
public ActionResult Register() 
{ 
    RegisterModel rm = new RegisterModel(); 

    //SelectListItem guestCategory = new SelectListItem(); 
    //guestCategory.Value = null; 
    //guestCategory.Text = "Guest"; 

    rm.Categories.Add(new SelectListItem { Value = null, Text = "Guest" }); 
... 

任何想法,为什么?

+3

分类永远不会被建造? – Nick

+6

'rm.Categories'为'null'。 – sloth

回答

8

你只需要将项目添加到列表,因为添加内容时之前做到这一点的不会被实例化为什么它给错误

rm.Categories = new List<SelectListItem>(); 

,这意味着在这个方法中做这样的

[AllowAnonymous] 
public ActionResult Register() 
{ 
    RegisterModel rm = new RegisterModel(); 

    rm.Categories = new List<SelectListItem>();//added line 

    rm.Categories.Add(new SelectListItem { Value = null, Text = "Guest" }); 
... 

你可以在构造函数RegisterModel中做同样的事情。

public class RegisterModel 
{ 
    public RegisterModel 
    { 
    Categories = new List<SelectListItem>();//added line 
    } 
7

在你的类的构造函数由于您使用的是auto-implemented property{get;set;}你必须在构造函数初始化它初始化列表

public class RegisterModel 
{ 
    RegisterModel() 
    { 
    Categories = new List<SelectListItem>(); 
    } 
...... 

。如果你不想在构造函数中做,那么你可以这样做:

public class RegisterModel 
{ 
    ... 
    private List<SelectListItem> _Categories = new List<SelectListItem>(); 

    private List<SelectListItem> Categories 
    { 
     get { return _Categories; } 
     set { _Categories = value; } 
    } 
} 

也可初始化与对象列表,使用它之前。

RegisterModel rm = new RegisterModel(); 
r.Categories = new List<SelectListItem>(); // like that 
rm.Categories.Add(new SelectListItem { Value = null, Text = "Guest" }); 

它的更好,如果你在初始化构造函数或通过一个私有字段列表(如果不使用自动实现的属性),因为你没有初始化对象的属性类别RegisterModel,每个对象的创建。

5

您从未初始化Categories任何东西。它是null

它初始化为空列表,以避免错误,最好是在构造函数中:

Categories = new List<SelectListItem>();