3

我可能在做一些愚蠢的事情,但不知道是什么。我正在尝试修改 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" });
...

任何想法为什么?

4

3 回答 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 
  }  
于 2013-01-10T10:03:26.993 回答
7

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

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

由于您使用的是自动实现的属性 {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" });

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

于 2013-01-10T10:03:29.797 回答
5

你从来没有初始化Categories任何东西。它是null

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

Categories = new List<SelectListItem>();
于 2013-01-10T10:03:32.947 回答