正如我所提到的,我有一个List<System.Drawing.Color>
的模型,它会在Seed()
中使用,如下所示:
protected override void Seed(DatabaseContext context)
{
var somethings = new List<Something>
{
new Something
{
Name="blah blah", Colors= { Color.Black, Color.Red }
}
};
}
只要我那边有Colors
,我总是接受
第Object reference not set to an instance of an object.
行var somethings = new List<Something>
。
当我删除Colors
时,它就消失了,一切正常,是什么导致了这个问题?如何解决这个问题?
感谢。
编辑:
Something
的型号:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
namespace MVCApplication7
{
public class Something
{
public int SomethingID { get; set; }
public string Name { get; set; }
public List<Color> Colors { get; set; }
}
}
控制器:
........
private DatabaseContext db = new DatabaseContext();
//
// GET: /Home/
public ViewResult Index()
{
return View(db.Somethings.ToList());
}
查看:(我确定这是无关紧要的,因为调试器显示Colors
为空。
@foreach (var itemColor in item.Colors)
{
Html.Raw(itemColor.ToString());
}
Global.asax中
.........
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
Database.SetInitializer<DatabaseContext>(new DatabaseInitializer());
}
答案 0 :(得分:3)
有可能您的Something
构造函数返回而未将Colors
属性设置为空列表。您的集合初始值设定项只是调用Colors.Add(Color.Black)
然后调用Colors.Add(Color.Red)
- 如果Colors
属性返回空引用,那么它将不起作用。
要么将其设置为空列表以开始(例如在构造函数中)或创建新列表并设置属性本身:
new Something
{
Name = "blah blah",
Colors = new List<Color> { Color.Black, Color.Red }
}
了解上述代码与原始代码之间的区别非常重要。您的代码当前等同于(在List<Something>
集合初始值设定项中):
Something tmp = new Something();
tmp.Name = "blah blah";
tmp.Colors.Add(Color.Black);
tmp.Colors.Add(Color.Red);
// Now add tmp to the list we're building.
我上面的代码相当于:
Something tmp = new Something();
tmp.Name = "blah blah";
List<Color> tmp2 = new List<Color>();
tmp2.Add(Color.Black);
tmp2.Add(Color.Red);
tmp.Colors = tmp2;
// Now add tmp to the list we're building
看到区别?
答案 1 :(得分:1)
在Something对象的构造函数中,确保要实例化一个新对象Colors。我的猜测是你的问题。你没有发布很多代码来使用。
这样的事情:
public Something()
{
this.Colors = new List<Color>();
}
这样,您将在Something对象中始终拥有一个有效的列表对象。
好的将模型代码更改为:
namespace MVCApplication7
{
public class Something
{
public int SomethingID { get; set; }
public string Name { get; set; }
public List<Color> Colors { get; set; }
public Something()
{
this.Colors = new List<Color>();
}
}
}
每次创建新的某个对象时,这将实例化一个新的颜色列表,并防止对象引用错误。
更新 好的,我上面列出的是您的模型,这是您对原始问题的解决方案:
var list = new List<Something>()
{
new Something(){SomethingID = 1,Name="John", Colors = {Color.Red,Color.Black}},
new Something(){SomethingID = 2,Name="George", Colors = {Color.Bisque,Color.Blue}},
new Something(){SomethingID = 3,Name="Chris", Colors ={Color.Khaki,Color.Cornsilk}}
};
foreach (var item in list)
{
Console.WriteLine(item.Name);
foreach (var color in item.Colors)
{
Console.WriteLine(color.ToString());
}
Console.WriteLine("");
}
您可以看到每个Something对象都有自己唯一的Colors列表。 如果这可以解决您的问题,请将此标记为答案。