#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
withCount
равное 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> (и, конечно, у меня есть цвета в нем)