Реализация списка флажков из списка в ASP.NET Core - PullRequest
0 голосов
/ 09 мая 2018

Я видел другие темы на эту тему, но у меня возникли проблемы с верным синтаксисом / настройкой. В конечном счете, контроллер не может видеть содержимое списка ролей, когда он возвращается из редактирования.

View

@model Models.Volunteer

            @foreach (var item in Model.Roles)
            {
                <input type="checkbox" asp-for="@item.Selected" />
                <label asp-for="@item.Selected">@item.RoleName</label>
                <input type="hidden" asp-for="@item.RoleId" />
                <input type="hidden" asp-for="@item.RoleName" />
                <br />
            }

<input type="submit" value="Save" class="btn btn-default" />

Модель

public abstract class BaseVolunteer
{
    [Key]
    public int Recno { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string City { get; set; }
    [NotMapped]
    [Display(Name = "Roles")]
    public List<Role> Roles { get; set; }
}

public class Role
{
    [Key]
    public String RoleId { get; set; }
    public String RoleName { get; set; }

    public bool Selected { get; set; }
}

Контроллер

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(int id, [Bind("Recno,FirstName,LastName,Email,City,Roles")] Volunteer volunteer)
    {
}

Добровольный объект в контроллере правильно возвращает другие значения ... но объект Roles равен NULL, несмотря на то, что он правильно заполнен для отображения.

1 Ответ

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

Вам необходимо использовать индексатор массива, чтобы связыватель модели знал индекс каждого элемента:

@for( Int32 i = 0; i < this.Model.Roles.Length; i++ ) {
    <input type="checkbox" asp-for="@Model.Roles[i].Selected" />
    <label asp-for="@Model.Roles[i].Selected">@Model.Roles[i].RoleName</label>
    <input type="hidden" asp-for="@Model.Roles[i].RoleId" />
    <input type="hidden" asp-for="@Model.Roles[i].RoleName" />
    <br />
} 

Это будет выглядеть примерно так:

    <input type="checkbox" name="Roles[0].Selected" value="false" id="Roles_0__Selected" />
    <label for="Roles_0__Selected">Admin</label>
    <input type="hidden" name="Roles[0].RoleId" value="10" />
    <input type="hidden" name="Roles[0].RoleName" value="Admin" />
    <br />

    <input type="checkbox" name="Roles[1].Selected" value="false" id="Roles_1__Selected" />
    <label for="Roles_1__Selected">Users</label>
    <input type="hidden" name="Roles[1].RoleId" value="120" />
    <input type="hidden" name="Roles[1].RoleName" value="Users" />
    <br />

    <input type="checkbox" name="Roles[2].Selected" value="false" id="Roles_2__Selected" />
    <label for="Roles_2__Selected">Guests</label>
    <input type="hidden" name="Roles[2].RoleId" value="123" />
    <input type="hidden" name="Roles[2].RoleName" value="Guestsd />
    <br />

Обратите внимание, что значения name="" содержат индекс, который может использовать связыватель модели.

...