Проблемы со списком

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

#c# #asp.net-mvc-3 #entity-framework #Цвет #начальное значение

Вопрос:

У меня есть модель с a 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 , что is пуст.

         @foreach (var itemColor in item.Colors)
        {
            Html.Raw(itemColor.ToString());
        }
 

Глобальный.asax

     .........
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        Database.SetInitializer<DatabaseContext>(new DatabaseInitializer());
    }
 

Ответ №1:

Скорее всего, ваш 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. Спасибо за ответ, на данный момент это больше не вызывает у меня проблем, хотя, когда я тестирую его и пытаюсь отобразить, например, первый цвет, я получаю то же самое сообщение об ошибке. и поэтому, конечно, отладчик показывает, что свойство «Colors» равно null. если вам, ребята, понадобится еще какой-нибудь код, просто дайте мне знать, какой именно, это меня очень смущает.

2. @Ken: Пожалуйста, покажите короткий, но полный пример, который демонстрирует проблему, если сможете. Мы понятия не имеем, как вы используете этот объект.

3. Что ж, инициализатор хорош, я сделал, как вы сказали ( Colors = new List<Color> { Color.Black, Color.Red } ) , и когда я пытаюсь записать в представление, например, внутри цикла foreach @item.Colors[0] , чтобы получить первый цвет, он выдает мне в этой строке ту же ошибку, что и раньше: Object reference not set to an instance of an object. отладчик показывает, что свойство Colors для элемента foreach» равно нулю.

4. @Ken: Как вы передаете значение в представление? Похоже, что именно в этом вполне может быть причина того, что все идет не так. Что показывает отладчик сразу после того, как вы создали объект? Если там есть нужные цвета, а позже их не будет, вам нужно определить, в какой момент они пропадут.

5. Я передаю их в представление внутри foreach item in Model и просто пишу item.Colors[0] , например. после выполнения того, что рекомендовал Zero21xxx в другом ответе, я больше не получаю это сообщение, список не равен нулю, но он пуст. когда я пытаюсь запустить код, он говорит, что индекс находится вне диапазона. итак, я проверил отладчик, у него было значение Colors with Count равное 0. просто пустой список. Я не уверен, что это та информация, которую вы просили, если это не так, пожалуйста, укажите, что вам нужно, чтобы помочь мне. Спасибо

Ответ №2:

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

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

ОБНОВЛЕНИЕ Ок с тем, что я перечислил выше в качестве вашей модели, вот ваше решение исходного вопроса:

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

Комментарии:

1. Спасибо за ответ, у меня все еще есть проблема, о которой я написал в ответе Джона Скита, если бы вы могли мне помочь, это было бы здорово. Спасибо.

2. Опубликуйте код вашего объекта Something. Тогда мы сможем увидеть, с чем мы на самом деле имеем дело.

3. Если вы имеете в виду модель, у нее есть только эти 3 свойства: int SomethingID , string Name , List<Color> Colors .

4. Отредактировал вопрос (первое сообщение)

5. Я не могу использовать его вне класса, поэтому я уверен, что вы хотите включить это в свойства. теперь это не null , но это пустой список List<Color> (и, конечно, у меня есть цвета в нем)