Как передать модель List в контроллер из представления http post - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть CategoryModel, который содержит элемент списка для ItemModel, а также некоторые другие строки и т. Д.

Я пытаюсь передать список из представления в контроллер.Модель на представлении - ABCModel, которая содержит список «Категории» типа CategoryModel.В представлении я только хочу опубликовать «активную» категорию для сохранения.

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

.cs Модели

    namespace Company.Models
    {
        public class ABCModel
        {
            public IList<CategoryModel> Categories;
            public SummaryModel Summary;
        }
    }

    namespace Company.Models
    {
    public class CategoryModel
    {
        public string Label { get; set; }
        public bool Active { get; set; }
        public decimal Amount { get; set; }
        public string Frequency { get; set; }
        public string Type { get; set; }
        public List<ItemModel> Items;
    }
    )

    namespace Company.Models
    {
    public class ItemModel
    {
        public string Label { get; set; }
        public string Explanation { get; set; }
        public string Amount { get; set; }
        public string Frequency { get; set; }
        public bool Flag { get; set; }
        public string Note { get; set; }
    }
    }

Контроллер

    [HttpPost]
        public ActionResult SaveItems([FromForm] CategoryModel activeCategoryModel, [FromForm] List<ItemModel> items, [FromQuery] string activecategory, [FromQuery] string nextcategory)
        {
        ...
        }

Просмотр

    @model ABCModel

    @{ CategoryModel nextCategory = null; }
    @{ CategoryModel activeCategoryModel = null; }

    @if (Model.Categories.Any())
    {
        @for (var i = 0; i < Model.Categories.Count; i++)
        {
            Company.Models.CategoryModel category = Model.Categories[i];

            @if (category.Active)
            {
                activeCategoryModel = category;
                if ((i + 1 < Model.Categories.Count) && (Model.Categories[i + 1] != null))
                {
                    nextCategory = Model.Categories[i + 1];
                }
            }
        }
    }

    <form id="ABC-form" class="needs-validation" novalidate="" asp-action="SaveItems" asp-controller="Home" method="post">

            @if (activeCategoryModel != null)
            {
                <input asp-for="@activeCategoryModel.Label" type="hidden" />
                <input asp-for="@activeCategoryModel.Active" type="hidden" />
                <input asp-for="@activeCategoryModel.Amount" type="hidden" />
                <input asp-for="@activeCategoryModel.Frequency" type="hidden" />
                <input asp-for="@activeCategoryModel.Type" type="hidden" />

                @if (activeCategoryModel.Items.Any())
                {    
                    @for (var i = 0; i < activeCategoryModel.Items.Count; i++)
                    {
                        @Html.HiddenFor(x => activeCategoryModel.Items[i].Label)
                        @Html.HiddenFor(x => activeCategoryModel.Items[i].Explanation)
                        @Html.TextBoxFor(x => items[i].Amount, new { @class = "form-control" })
                    }
                }
            }
        <button id="continue" type="submit" asp-action="SaveItems" asp-route-activecategory="@activeCategoryModel.Label" asp-route-nextcategory="@(nextCategory != null ? nextCategory?.Label : null)">Continue</button>
    </form>

Я включил IFormCollection в качестве параметра в SaveItemsна контроллере, и это показало, что элементы передаются в формате, который, как я думал, будет работать, но модель показывает только введенные значения, а список элементов равен нулю.

IFormCollection on hover in debug on controller

activeCategoryModel on hover in debug on controller - items = null

Как заполнить список элементов в модели активной категории извид?

1 Ответ

1 голос
/ 20 сентября 2019

Items в CategoryModel должно быть свойством, а не полем, поэтому ваш CategoryModel должен выглядеть следующим образом:

public class CategoryModel
{
    public string Label { get; set; }
    public bool Active { get; set; }
    public decimal Amount { get; set; }
    public string Frequency { get; set; }
    public string Type { get; set; }
    public List<ItemModel> Items { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...