将项目添加到List <T>

Bar*_*osz 3 c# asp.net-mvc simplemembership

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

public class RegisterModel
{
    ...

    public List<SelectListItem> Categories { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后在帐户控制器中我试图将一个项目添加到此列表但得到" 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" });
...
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

Pra*_*ana 8

你只需要在将项添加到列表之前执行此操作,因为当您添加项时,它不会实例化为什么它给出错误

rm.Categories = new List<SelectListItem>();
Run Code Online (Sandbox Code Playgroud)

这意味着在这种方法中这样做

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

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

    rm.Categories.Add(new SelectListItem { Value = null, Text = "Guest" });
...
Run Code Online (Sandbox Code Playgroud)

要么

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

public class RegisterModel
{
  public RegisterModel
  {
    Categories = new List<SelectListItem>();//added line 
  }  
Run Code Online (Sandbox Code Playgroud)


Hab*_*bib 7

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

public class RegisterModel
{
    RegisterModel()
    {
     Categories  = new List<SelectListItem>();
    }
......
Run Code Online (Sandbox Code Playgroud)

由于您使用的是自动实现的属性 {get;set;},因此必须在构造函数中对其进行初始化.如果你不想在构造函数中做,那么你可以这样做:

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

    private List<SelectListItem> Categories
    {
        get { return _Categories; }
        set { _Categories = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是如果你在构造函数中初始化列表或通过私有字段 (如果不使用自动实现的属性),它会更好.因为那样你就不必在RegisterModel创建每个对象时初始化Class对象的属性.


Ode*_*ded 5

你从来没有初始化Categories为任何东西.是的null.

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

Categories = new List<SelectListItem>();
Run Code Online (Sandbox Code Playgroud)