asp.net mvc Binder не обновляет значение RoleId в режиме редактирования - PullRequest
0 голосов
/ 24 мая 2018

У меня есть расширенный класс User, подобный этому:

public class User : IdentityUser
{
  public string Nombre { get; set; }
  public string Apellidos { get; set; }
  public int DepartamentoID { get; set; }
  public Departamento Departamento { get; set; }
}

В моем представлении «Правка» у меня есть это определение поля:

<div class="form-group">
   @Html.LabelFor(model => model.Roles.FirstOrDefault().RoleId, htmlAttributes: new { @class = "control-label col-md-2" })
   <div class="col-md-10">
      @Html.DropDownListFor(m => m.Roles.ElementAtOrDefault(0).RoleId, (SelectList)ViewBag.RoleList, "Seleccionar un rol", new { @class = "form-control" })
      @Html.ValidationMessageFor(model => model.Roles.FirstOrDefault().RoleId)
   </div>
</div>

Когда я отправляю форму, коллекция ролейempty.

Почему Binder не добавляет роль в коллекцию ролей?

Приветствия и благодарности.

Я пытаюсь добавить больше информации, чтобы ответить на комментарии Раджеша.

В действии Get модель содержит информацию о роли, и представление показывает ее правильно.В раскрывающемся списке отображаются доступные роли, а роль пользователя отображается выбранной.Когда в представлении я выбираю другую роль и отправляю форму, в действии «Опубликовать» коллекция ролей модели больше не содержит информацию.

Действие GET

POST action

Я не знаю, как отлаживать работу Binder

1 Ответ

0 голосов
/ 25 мая 2018

Почему связыватель не добавляет роль в коллекцию ролей?

Это происходит потому, что @Html.DropDownListFor и связыватель модели по умолчанию недостаточно умны.Ваш @Html.DropDownListFor производит что-то вроде этого:

<select class="form-control" id="RoleId" name="RoleId">
    <option value="1">Role_1</option>
    <option value="2">Role_2</option>
</select>

Поскольку name=RoleId механизм связывания модели будет пытаться связать его со свойством RoleId вашей модели, и он ничего не знает о свойстве Roles и, более того, чтоRoles prop является перечисляемым.

Чтобы это работало, ваша модель должна иметь свойство RoleId или вы можете использовать расширение Html.ListBoxFor, если хотите выбрать несколько ролей:

@Html.ListBoxFor(m => m.SelectedRoles, (SelectList)ViewBag.RoleList, new { @class = "form-control" })

Тогда ваша модель должна иметь свойство public List<string> SelectedRoles { get; set; }.

Другой вариант - создать пользовательский механизм связывания модели с использованием интерфейса IModelBinder.Эта опция дает вам неограниченные возможности для сопоставления данных запроса с моделью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...