使用List <color> </color>遇到麻烦

时间:2011-10-27 22:39:35

标签: c# asp.net-mvc-3 entity-framework colors seed

正如我所提到的,我有一个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());
    }

2 个答案:

答案 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列表。 如果这可以解决您的问题,请将此标记为答案。