向List<T>添加项目

3

我可能做了一些愚蠢的事情,但是无法找出问题所在。我正在尝试修改ASP.NET MVC 4中的简单会员功能。我略微修改了一个附带模板的RegisterModel,并像这样添加了一个类别列表:

public class RegisterModel
{
    ...

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

然后,在账户控制器中,我尝试向此列表添加一个项目,但是出现了“对象引用未设置为对象的实例”错误:

[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.Categoriesnull - sloth
3个回答

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
在你的类构造函数中初始化列表。
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; }
    }
}

您可以在使用列表之前使用对象对其进行初始化。
RegisterModel rm = new RegisterModel();
r.Categories = new List<SelectListItem>(); // like that
rm.Categories.Add(new SelectListItem { Value = null, Text = "Guest" });

但是最好在构造函数中初始化列表或通过私有字段进行初始化(如果没有使用自动实现属性),因为这样你就不必为每个Class RegisterModel对象的属性初始化。


5

您从未对 Categories 进行初始化。它是 null

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

Categories = new List<SelectListItem>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接