将项目添加到列表<t> </t>

时间:2013-01-10 10:02:04

标签: c# asp.net-mvc simplemembership

我可能正在做些傻事但却找不到什么。我正在尝试修改ASP.NET MVC 4中的简单成员资格功能。我稍微修改了随模板一起使用的RegisterModel,并添加了一个类别列表,如下所示:

public class RegisterModel
{
    ...

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

然后在帐户控制器中我尝试将一个项目添加到此列表中但得到“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 个答案:

答案 0 :(得分: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 
  }  

答案 1 :(得分:7)

在类构造函数中初始化列表

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

由于您使用的是 auto-implemented property {get;set;},因此必须在构造函数中对其进行初始化。如果你不想在构造函数中做,那么你可以这样做:

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

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

在使用之前,您还可以使用对象初始化List。

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

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

答案 2 :(得分:5)

您从未将Categories初始化为任何内容。它是null

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

Categories = new List<SelectListItem>();