Список или Выбор Список продолжает возвращать Ошибка ссылки на объект

Мое приложение использует 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>
Другие вопросы по тегам