Почему при передаче модели со списком дочерних объектов в контроллер список дочерних объектов не передается? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть 2 модели классов:

public class ModelWithList 
{
    int Id { get; set; }
    string Name { get; set; }
    List<SetOfGroups> GroupSets { get; set; }
}

public class SetOfGroups
{
    List<Groups> Groups { get; set; }
}

Когда я отправляю свою форму, все поля проходят через ModelWithList, за исключением групповых наборов.

Обычно я бы использовал @Html.HiddenFor(model => model.GroupSets) для свойств, которые не были переданы, но этого нельзя сделать со списками пользовательских моделей.

1 Ответ

0 голосов
/ 04 сентября 2018

Предположим, у вас есть эта модель настройки:

public class ModelWithList {
    int Id { get; set; }
    string Name { get; set; }
    List<SetOfGroups> GroupSets { get; set; }
}

public class SetOfGroups
{
    public int GroupId { get; set; }
    public string GroupName { get; set; }
}

Затем вы можете использовать цикл for для итерации GroupSets и назначить его индекс для каждого числового типа / string / DateTime (включая Nullable<T>) свойства, которые он имеет:

@model ModelWithList

@* other code *@

@for (int i = 0; i < Model.GroupSets.Count; i++)
{
    @Html.HiddenFor(model => model.GroupSets[i].GroupId)

    @Html.HiddenFor(model => model.GroupSets[i].GroupName)
}

Далее, предположим, что вы перемещаете SetOfGroups свойства и создайте новый список:

public class SetOfGroups
{
    List<Group> Groups { get; set; }
}

public class Group
{
    public int GroupId { get; set; }
    public string GroupName { get; set; }
}

Затем вы должны добавить еще один цикл for, чтобы связать их:

@model ModelWithList

@* other code *@

@for (int i = 0; i < Model.GroupSets.Count; i++)
{
    @for (int j = 0; j < Model.GroupSets[i].Groups.Count; j++)
    {
        @Html.HiddenFor(model => model.GroupSets[i].Groups[j].GroupId)

        @Html.HiddenFor(model => model.GroupSets[i].Groups[j].GroupName)
    }
}

Хотя возможно добавить вложенные списки в представление, как в примере выше, циклы для рендеринга помощников HTML станут более сложными, и их следует избегать.

Важное примечание:

Вы не должны назначать HiddenFor для List<T> следующим образом:

@Html.HiddenFor(model => model.GroupSets)

, поскольку Razor неявно вызывает метод ToString() для этого объекта List<T>, в результате чего полное имя списка вставляется в атрибут value, и привязка будет игнорировать его, поскольку GroupSets не является string свойство:

<input id="GroupSets" name="GroupSets" type="hidden" value="System.Collections.Generic.List`1[ProjectNamespace.Models.SetOfGroups]">

Похожие проблемы:

Элемент списка внутри модели всегда пуст в сообщении - Asp.net MVC

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