Список флажков теряется при отправке формы - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть эти модели представления для сотрудников и их ролей:

public class EmployeeViewModel
{
    public int Id { get; set; }
    // some more properties
    public List<EmployeeRoleViewModel> EmployeeRoles { get; set; }
}

public class EmployeeRoleViewModel
{
    public int Id { get; set; }
    public int EmployeeId { get; set; }
    public int RoleId { get; set; }
    public string Title { get; set; }
    public bool Selected { get; set; }
}

Я отображаю флажки, подобные этому, в представлении редактирования:

@for (int i = 0; i < Model.EmployeeRoles.Count(); i++)
{
<label>
    <input type="checkbox" asp-for="@Model.EmployeeRoles[i].Selected" />
    @Model.EmployeeRoles[i].Title
</label>
}

Это генерирует этот HTML дляфлажок:

<input type="checkbox" checked="checked" 
    id="EmployeeRoles_0__Selected" 
    name="EmployeeRoles[0].Selected" value="true" />

... и это для непроверенного:

<input type="checkbox" 
    id="EmployeeRoles_2__Selected" 
    name="EmployeeRoles[2].Selected" value="true" />

Все флажки отображаются правильно, с флажками на всех правильных полях.

Форма размещена в этом методе контроллера (упрощенно для краткости):

[HttpPost]
public async Task<IActionResult> Edit(int id,[Bind("Id,EmployeeRoles")] Employee employee)
{
    db.Update(employee);
    await db.SaveChangesAsync();
    return RedirectToAction("Details", "Branches");
}

Проблема в том, что employee.EmployeeRoles - это список длины 0, даже если установлены несколько флажков.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

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

@for (int i = 0; i < Model.EmployeeRoles.Count(); i++)
{
    <label>
        <input type="checkbox" asp-for="@Model.EmployeeRoles[i].Selected" />
        @Model.EmployeeRoles[i].Title
    </label>

    <input type="hidden" asp-for="@Model.EmployeeRoles[i].Id" />
    <input type="hidden" asp-for="@Model.EmployeeRoles[i].Title" />
}

Затем на контроллере вы можете получить списки: enter image description here

Затем проверьтеSelected свойств для подтверждения выбора текущей роли.

0 голосов
/ 26 ноября 2018

Поле name поля input должно быть

name="Employee.EmployeeRoles[index].Selected"

, чтобы EmployeeRoles[index] связывался со списком EmployeeRoles внутри Employee объект.

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