gcogco10 Ответов: 1

Там нет элемента viewdata типа ienumerable<selectlistitem>, который имеет ключ?


Привет Команда

Я использую DropDownlistFor для того, чтобы получить весь список доступных стран в мире. Теперь я получаю это исключение, говоря, что нет элемента ViewData IEnumerable. Этот тип создается только на моем контроллере, нужно ли мне создавать его на моем классе модели.

Что я уже пробовал:

private IEnumerable<SelectListItem> GetCountryList()
  {
      SelectList listcn = null;
      try
      {
          var list = this.LoadData().Select(p => new SelectListItem
          {
              Value = p.Country_Id.ToString(),
              Text = p.Country_Name
          });
          listcn = new SelectList(list, "Value", "Text");

      }catch(Exception ex)
      {
         // throw ex;
      }
      return listcn;
  }


   private List<EditTrainingRegFormViewModel> LoadData()
{
    List<EditTrainingRegFormViewModel> lst = new List<EditTrainingRegFormViewModel>();

    try
    {
        string line = string.Empty;
        string srcFilePath = "Content/files/country_list.txt";
        var rootPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);
        var fullPath = Path.Combine(rootPath, srcFilePath);
        string filePath =  new Uri(fullPath).LocalPath;
        StreamReader src = new StreamReader(new FileStream(filePath, FileMode.Open, FileAccess.Read));

        // while to read the file
        while((line = src.ReadLine()) !=null) {
          EditTrainingRegFormViewModel infoLst = new EditTrainingRegFormViewModel();
            string[] info = line.Split(',');

            //Setting
            infoLst.Country_Id = Convert.ToInt32(info[0].ToString());
            infoLst.Country_Name = info[1].ToString();

            lst.Add(infoLst);
        }
        src.Dispose();
        src.Close();
    }catch(Exception ex)
    {
        Console.Write(ex);
    }
    return lst;
}


// Selection for countries in the world.

      public ActionResult DropDownSelect()
      {
          EditTrainingRegFormViewModel model = new EditTrainingRegFormViewModel();

          model.SelectedCountryId = 0;

          this.ViewBag.CountryList = this.GetCountryList();
          return this. View(model);
      }


@Html.DropDownListFor(m=>m.SelectedCountryId, this.ViewBag.CountryList as SelectList, new {@class = "form-control"})

1 Ответов

Рейтинг:
2

Richard Deeming

Посмотрите на соответствующих видах :

ViewBag.CountryList присваивается значению, возвращаемому GetCountryList().

GetCountryList возвращает IEnumerable<SelectListItem>.

Ваш взгляд пытается бросить ViewBag.CountryList К SelectList используя as оператор. Это вернется null, потому что значение не является SelectList. Нет никакого преобразования между IEnumerable<SelectListItem> и SelectList.

Измените свое представление, чтобы указать правильный тип, и используйте приведение вместо as таким образом, вы получите лучшее сообщение об ошибке, если приведение не удастся:

@Html.DropDownListFor(m => m.SelectedCountryId, (IEnumerable<SelectListItem>)ViewBag.CountryList, new { @class = "form-control" })
Операторы тестирования типов и приведения - Справочник по C# | Microsoft Docs[^]
Класс SelectList (System.Web.Mvc) | Microsoft Docs[^]
SelectExtensions.Метод DropDownListFor (System.Web.Mvc.Html) | Microsoft Docs[^]