Список или Выбор Список продолжает возвращать Ошибка ссылки на объект
Мое приложение использует Asp.Net Core. EF Core. Я использую модель представления, а не модель EF и шаблон репозитория. Мою модель представления я создал сам. Это не связано с EF или чем-то еще. Может быть, я ошибаюсь?
Редактировать новую ViewModel:
public partial class CommodityViewModel
{
public CommodityViewModel()
{
}
public IEnumerable<SelectListItem> CommoditiesItems { get; set; }
public Guid Oid { get; set; }
public string Code { get; set; }
public string Description { get; set; }
}
РЕДАКТИРОВАТЬ: Новый интерфейс Вот мой интерфейс:
public interface ICommodityRepository
{
IEnumerable<CommodityViewModel> GetCommodities();
}
Мой вопрос по моему интерфейсу: могу ли я использовать IEnumerable для списка или списка выбора?
Редактировать новый репозиторий:
public class CommodityRepository : ICommodityRepository
{
private readonly CommodityViewModel _context;
public CommodityRepository(CommodityViewModel context)
{
_context = context;
}
public IEnumerable<CommodityViewModel> GetCommodities()
{
return _context.CommoditiesList.ToList();
}
}
Вот мой контроллер:
public class CommoditiesController : Controller
{
private readonly ICommodityRepository _commoditiyRepository;
public CommoditiesController(ICommodityRepository commodityRepository)
{
_commoditiyRepository = commodityRepository;
}
public IActionResult CommoditiesList()
{
return View(_commoditiyRepository.GetCommodities());
}
}
И мой вид, который я использую для отображения раскрывающегося списка, потому что я хочу, чтобы он был доступен с каждой страницы. (Я знаю, что я должен поставить это в частичном представлении. Я просто хочу, чтобы это работало первым.):
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-bell"></i> <b class="caret"></b></a>
<ul class="dropdown-menu alert-dropdown">
<li>
<select asp-for="Code" asp-items="@(new SelectList(Model.CommoditiesList,"Code","Description"))">
<option>Please select one</option>
</select>
</li>
</ul>
</li>
Вот ошибка, которую я не могу преодолеть:
NullReferenceException: ссылка на объект не установлена на экземпляр объекта. MoveNext в _Layout.cshtml, строка 134
<!-- Here: Line 134--><select asp-for="Code" asp-items="@(new SelectList(Model.CommoditiesList,"Code","Description"))">
<option>Please select one</option>
</select>
Я действительно не знаю, где я иду не так. Я создал новый список в методе хранилища. Я даже создал новый список в ViewModel. Кто-нибудь может указать мне правильное направление? Благодарю.
1 ответ
SelectListItem является проблемой пользовательского интерфейса, поэтому ваш репозиторий не должен возвращать это, он должен возвращать IEnumerable или List, и вы преобразуете это в IEnumerable или List of SelectListItem в контроллере.
Я делаю нечто подобное в моем проекте со списком часовых поясов. ViewModel имеет свойство для IEnumerable из SelectListItem, мои данные поступают из коллекции только для чтения. мой код такой:
model.TimeZoneId = selectedSite.TimeZoneId;
model.AllTimeZones = tzHelper.GetTimeZoneList().Select(x =>
new SelectListItem
{
Text = x,
Value = x,
Selected = model.TimeZoneId == x
});
и моя бритва выглядит так:
<div class="form-group">
<label asp-for="TimeZoneId" class="col-md-2 control-label">@sr["Time Zone"]</label>
<div class="col-md-10">
<select asp-for="TimeZoneId"
asp-items="Model.AllTimeZones" class="form-control"></select>
<span asp-validation-for="TimeZoneId" class="text-danger"></span>
</div>
</div>