MVC dynamici c раскрывающийся список не работает, появляется ошибка "Нет элемента ViewData типа 'IEnumerable <SelectListItem>', который имеет ключ 'LocID'. '" - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь связать значения dropownlist из базы данных, используя приведенный ниже код, но он выдает ошибку в поле зрения. Я сделал несколько упражнений, но не смог достичь результата. Может кто-нибудь помочь мне с этим?

Ошибка:

Нет элемента ViewData типа 'IEnumerable', который имеет ключ 'LocID'. '

Код действия:

public ActionResult Add()
{
    List<Location> listObj = new List<Location>();
    {
        listObj = LocDrpDwnList();
    };
    List<SelectListItem> LocList = new List<SelectListItem>();

    foreach(var item in listObj)
    {
        LocList.Add(new SelectListItem
        {
            Text = item.LocationName.ToString(),
            Value = Convert.ToInt32(item.LocID).ToString()
        }) ;
    }

    ViewBag.LocID = LocList;
    return View();
}

Метод получения значений списка из базы данных:

public List<Location> LocDrpDwnList()
{
    SqlConnection db = new SqlConnection(conn);
    string query = "SELECT * FROM Location";
    SqlCommand cmd = new SqlCommand(query, db);
    db.Open();
    List<Location> loclist = new List<Location>();
    using (IDataReader dataReader = cmd.ExecuteReader())
    {
        while (dataReader.Read())
        {
            Location obj = new Location();
            if (dataReader["LocID"] != DBNull.Value)
            {
                if (dataReader["LocID"] != DBNull.Value) { obj.LocID = Convert.ToInt32(dataReader["LocID"]); }
                if (dataReader["LocationName"] != DBNull.Value) { obj.LocationName =               (string)dataReader["LocationName"]; }
                loclist.Add(obj);
            }
        }
        return loclist;
    }
}

Просмотр для раскрывающегося списка управления:

 @Html.DropDownListFor(model => model.LocID, (IEnumerable<SelectListItem>)ViewBag.LocID , "Select Location", new { htmlAttributes = new { @class = "form-control" } })

Ответы [ 2 ]

1 голос
/ 13 января 2020

Пожалуйста, измените действие вашего контроллера как:

public ActionResult Add()
{
    List<Location> listObj = LocDrpDwnList();
    /*
     // Doesn't hurt populating SelectListItem this way. But you don't need to do this here. 
    List<SelectListItem> LocList = new List<SelectListItem>();

    foreach (var item in listObj)
    {
        LocList.Add(new SelectListItem
        {
            Text = item.LocationName.ToString(),
            Value = Convert.ToInt32(item.LocID).ToString()
        });
    }
    */
    ViewBag.LocID = (string?)null; //Set to some predefined locId selection, so when page is loaded, dropdown will be defaulted to this value.
    ViewBag.LocList = LocList;

    return View();
}

, а затем обновите свой вид как:

@{
    var LocList = new SelectList(ViewBag.LocList, "Id", "Text");
    string LocId = ViewBag.LocId ?? (string)null;
}

@Html.DropDownList(@LocId, @LocList , "Select Location", new { htmlAttributes = new { @class = "form-control" } })

Вместо использования ViewBags рекомендуется использовать ViewModels, как показано ниже:

public class AddViewModel
{
    public AddViewModel()
    {
        this.LocList = new List<LocationViewModel>();
    }

    public int? LocId { get; set; }
    // Instead of LocationViewModel, you can go with your idea List<SelectListItem> and change controller action and view accordingly.
    public List<LocationViewModel> LocList { get; set; }
}

public class LocationViewModel
{
    public int LocId { get; set; }
    public string LocationName { get; set; }
}

и ваше действие контроллера будет:

public ActionResult Add()
{
    List<Location> listObj = LocDrpDwnList();

    List<LocationViewModel> LocList = new List<LocationViewModel>();

    foreach (var item in listObj)
    {
        LocList.Add(new LocationViewModel
        {
            LocationName = item.LocationName.ToString(),
            LocId  = Convert.ToInt32(item.LocID).ToString()
        });
    }
/*
    ViewBag.LocID = (string?)null; //Set to some predefined locId selection, so when page is loaded, dropdown will be defaulted to this value.
    ViewBag.LocList = LocList;*/

    return View(new AddViewModel{LocList = LocList});
}

, и ваше представление будет;

@using AddViewModel
@Html.DropDownList(m => m.LocId, new SelectList(Model.@LocList, "Id", "Text") , "Select Location", new { htmlAttributes = new { @class = "form-control" } })
0 голосов
/ 13 января 2020

Я полагаю, что вы пытаетесь создать запись в базе данных после выбора значения из DROP DOWN LIST. Если я не ошибаюсь, в упомянутом вами коде контроллера нет заголовка POST, вам нужно создать еще один контроллер с тем же именем у слушателя {HttpPost}.

Пожалуйста, найдите ссылку ниже, возможно, вы найдете какую-либо помощь.

...