Список<Object> в HttpPost is Null

У меня есть страница администратора в моем веб-приложении MVC5, где выбирается пользователь, и после нажатия кнопки "Продолжить" появляется список всех ролей с флажками (через Ajax). Если пользователь находится в любой из этих ролей, флажок будет установлен автоматически.

Я хочу передать List в моем методе HttpPost, как только пользователь установит / уберет флажки для каждой роли. Тем не менее, параметр моего метода действия имеет значение null, но в Request.Form есть значения.

Я не понимаю, почему это так. Также мне действительно нужно использовать @Html.HiddenFor() для каждого параметра в моей viewmodel, чтобы все работало правильно?

RoleCheckBoxViewModel

public class RoleCheckBoxViewModel
{

    [Display(Name = "Choose Role(s)")]
    [Key]
    public string RoleId { get; set; }
    public string UserId { get; set; }
    public string Name { get; set; }
    [Display(Name="boxes")]
    public bool IsChecked { get; set; }

}

RolesController Action

[HttpPost]
public ActionResult Update(List<RoleCheckBoxViewModel> list) //the model in my view is a List<RoleCheckBoxViewModel> so then why is it null?
{
      //these next two lines are so that I can get to the AddToRole UserManagerExtension 
      var userStore = new UserStore<ApplicationUser>(_context);
        var userManager = new UserManager<ApplicationUser>(userStore);
        foreach (var item in Request.Form) //it's messy but I can see the data in this Form
        {
            System.Console.WriteLine(item.ToString());
        }
        //AddToRole for any new checkboxes checked
        //RemoveFromRole any new checkboxes unchecked
        //context save changes

        return RedirectToAction("Index");
}

Частичное представление AllRoles (результат предыдущего вызова AJAX)

@model List<Core.ViewModels.RoleCheckBoxViewModel>



@using (Html.BeginForm("Update", "Roles", FormMethod.Post))
{
<p>
    Select Roles
</p>
<table class="table">

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(model => item.Name)
                @Html.CheckBoxFor(model => item.IsChecked)
            </td>
        </tr>
        @Html.HiddenFor(model => item.RoleId)
        @Html.HiddenFor(model => item.UserId)
        @Html.HiddenFor(model => item.IsChecked)
        @Html.HiddenFor(model => item.Name)

    }
</table>
<input type="submit" value="Save" class="glyphicon glyphicon-floppy-save" />
}

1 ответ

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

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

@for(int i=0; i < Model.Count' i++)
{
    <tr>
        <td>
            @Html.DisplayFor(model => Model[i].Name)
            @Html.CheckBoxFor(model => Model[i].IsChecked)
        </td>
    </tr>
        @Html.HiddenFor(model => Model[i].RoleId)
        @Html.HiddenFor(model => Model[i].UserId)
        @Html.HiddenFor(model => Model[i].IsChecked)
        @Html.HiddenFor(model => Model[i].Name)

}

Надеюсь, поможет!

Другие вопросы по тегам