我可能正在做些傻事但却找不到什么。我正在尝试修改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" });
...
任何想法为什么?
答案 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>();