MultiselectList с выбранными значениями предварительно не выбран в представлении - PullRequest
0 голосов
/ 19 марта 2019

У меня есть простой сервис: 1. Получение всех ролей в системе 2. Проверка роли текущего выбранного пользователя 3. Отображение всех ролей в раскрывающемся списке, выбор текущих ролей пользователя по умолчанию

КомуДля этого у меня есть следующий код:

 public ActionResult Edit(string userId)
        {

            var user = _oAuthUserService.GetUsers()?.Where(u => u.UserId == userId).FirstOrDefault();

            var userRoles = user.Roles; //[Admin,Manager]

            var allRolesFromService = _oAuthUserService.AllRoles.Select(x=>new {
                Id =x.RoleName,
                Name =x.RoleName
            }).ToList(); //All roles in the System [Role1,Role2,Role3,Admin,Manager]


            ViewData["AllRoles"] = new MultiSelectList(allRolesFromService, "Id", "Name", userRoles);


            return View(user);


        }

По моему мнению,

@Html.ListBox("AllRoles", (MultiSelectList)ViewData["AllRoles"], new { multiple = "multiple" });

Но когда я перехожу к просмотру, ни один из элементов не выбирается заранее?Что мне здесь не хватает?

1 Ответ

1 голос
/ 19 марта 2019

Проблема возникает из-за того, что вы используете то же имя ключа ViewData, что и имя модели, связанное с ListBox помощником в этой строке:

@Html.ListBox("AllRoles", (MultiSelectList)ViewData["AllRoles"], new { multiple = "multiple" })

Предполагается, что AllRoles является свойством массива или спискавнутри класса viewmodel вы не можете повторно использовать его как ViewData имя ключа, потому что между ними произойдет конфликт имен, в результате списки параметров не будут отображаться должным образом.Вы можете переименовать ViewData имя ключа с любым именем, отличным от имени свойства viewmodel:

ViewData["AllRolesList"] = new MultiSelectList(allRolesFromService, "Id", "Name", userRoles);

, а затем использовать новое имя ключа в ListBox(For) helper:

ListBox helper

@Html.ListBox("AllRoles", (MultiSelectList)ViewData["AllRolesList"], new { multiple = "multiple" })

ListBox для помощника

@Html.ListBoxFor(model => model.AllRoles, (MultiSelectList)ViewData["AllRolesList"], new { multiple = "multiple" })
...