Возникли проблемы со списком <Color> - PullRequest
0 голосов
/ 28 октября 2011

У меня есть модель с 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 ]

3 голосов
/ 28 октября 2011

Скорее всего, ваш 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 голос
/ 28 октября 2011

В конструкторе вашего объекта 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>(); 
        }
    }
}

Это будет создавать новый список цветов каждый раз, когда вы создаете новый объект что-то, и предотвращает ошибку ссылки на объект.

UPDATE Хорошо с тем, что я перечислил выше в качестве вашей модели, вот ваше решение исходного вопроса:

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 есть свой уникальный список цветов. Пожалуйста, отметьте это как ответ, если это решит вашу проблему.

...