Как привязать идентификатор к выбранному значению @Html.выпадающего списка в веб-сетке

#c# #asp.net-mvc #html-select #webgrid

#c# #asp.net-mvc #html-выберите #веб-сетка

Вопрос:

У меня есть представление в моем проекте MVC, в котором есть веб-сетка, которая привязана к модели «Учетной записи», которую я передал в представление.

В моем контроллере «Account» я создал список выбранных списков, который содержит параметры выпадающего списка, которые я затем установил в ViewBag:

 public ActionResult Index()
{
   var accounts = db.Accounts;
   var groups = db.Groups;

   List<SelectListItem> groupList = new List<SelectListItem>();
   foreach(var item in groups)
   {
       groupList.Add(new SelectListItem()
       {
            Value = item.group_id.ToString(),
             Text = item.group_name
       });
    }

    ViewBag.Groups = groupList;


    return View(accounts);
}
  

Выпадающий список содержит 3 записи с их значением и текстом следующим образом:

1, Один 2, два 3, три

Моя проблема заключается в получении group_id (значения) привязанных данных для правильного отображения group_name (текста) в выпадающем списке.

Это то, что у меня есть на данный момент:

 grid.Column("group_id","Group", format: (item) => @Html.DropDownList("GroupId", (List<SelectListItem>)ViewBag.Groups))
  

Выпадающий список действительно содержит все 3 значения, о которых я упоминал ранее, он просто вообще не устанавливает выпадающий список на правильный для всех привязанных учетных записей, как показано на рисунке:

Веб-сетка учетной записи

Я отредактировал этот пост, чтобы добавить свой код просмотра.

 @model IEnumerable<Account>

@{
    ViewBag.Title = "Index";

    WebGrid grid = new WebGrid(Model, rowsPerPage: 10);
}

<h2>Fee Invoices</h2>


@grid.GetHtml(tableStyle: "table table-bordered",
 mode: WebGridPagerModes.All,
 firstText: "<< First",
 previousText: "< Prev",
 nextText: "Next >",
 lastText: "Last >>",
    columns: grid.Columns(
    grid.Column("account_name", "Account"),
    grid.Column("account_number", "Account Number"),
    grid.Column("as_of_date", "Date", format: (item) => string.Format("{0:MM/dd/yyyy}", item.as_of_date)),
    grid.Column("approved", "Approved", format: @<text><input id="select" class="box" name="select" type="checkbox" @(item.approved ? "checked='checked'" : "") value="@item.approved" /></text>),
    grid.Column("group_id","Group", format: (item) => @Html.DropDownList("GroupId", (List<SelectListItem>)ViewBag.Groups))
)


))
  

Ответ №1:

Вы можете передать Dictionary<int, string> из group_id и group_name в свое представление вместо списка из SelectListItem , а затем использовать его для создания DropDownList с выбранным правильным значением.

В контроллере

 public ActionResult Index()
{
   var accounts = db.Accounts;
   var groups = db.Groups;

   // this line creates a Dictionary<int, string> where group_id is the key and group_name the value
   var groupsNames = groups.ToDictionary(x => x.group_id, x => x.group_name);

   ViewBag.GroupsNames = groupsNames;

   return View(accounts);
}

  

Затем в представлении объявляется функция, подобная этой (обычно перед html-частью)

 @functions
{
    public List<SelectListItem> CreateSelectList(int groupId)
    {
        var newList = new List<SelectListItem>();

        foreach (var val in (Dictionary<int, string>)ViewBag.GroupsNames)
        {
            newList.Add(new SelectListItem
            {
                Text = val.Value,
                Value = val.Key.ToString(),
                Selected = val.Key == groupId
            });
        }

        return newList;
    }
}
  

и использовать его для заполнения выпадающего списка

 grid.Column("group_id", "Group", format: (item) => Html.DropDownList("GroupId", CreateSelectList((int)item.group_id)))
  

Или, если вам не нужен выпадающий список, а вместо этого вы просто хотите отобразить название группы, вы можете сделать

 grid.Column("group_id", "Group", format: (item) => ((Dictionary<int, string>)ViewBag.GroupsNames)[item.group_id])
  

и в этом случае вам не нужна функция.