Опубликовать список на контроллере с помощью tag-helpers и dotnet core - PullRequest
0 голосов
/ 21 марта 2019

Я видел похожие вопросы по этой проблеме, но помощники по тегам крутят мой вопрос.Я хочу, чтобы пользователь мог выбирать между различными уровнями сидений, выбирать несколько мест с этого уровня, и когда они отправляют кучу объектов с подробной информацией о количестве мест, выбранных на каждом уровне (наряду с некоторыми другими деталями, опущеныб / с я еще не добрался) идет к контроллеру, который затем будет выполнять некоторую логику ...

У меня есть моя модель:

public class PerformanceDetailsViewModel
    {
        public int Id { get; set; }
        public string ZoneDescription { get; set; }
        public string ShowName { get; set; }
        public DateTime ShowDateTime { get; set; }
        public string VenueName { get; set; }
        public decimal Price { get; set; }
        public int NumberOfTickets { get; set; }
        public List<SelectListItem> NumberSeatSelect { get; } = new List<SelectListItem>
        {
            new SelectListItem { Value = "0", Text = "0" },
            new SelectListItem { Value = "1", Text = "1" },
            new SelectListItem { Value = "2", Text = "2" },
            new SelectListItem { Value = "3", Text = "3" },
            new SelectListItem { Value = "4", Text = "4" }
        };
    }

Мой взгляд:

@model List<PerformanceDetailsViewModel>

<h1>@Model.Select(x => x.ShowName).First()</h1>
<h4>@Model.Select(x => x.ShowDateTime).First()</h4>
<h5>@Model.Select(x => x.VenueName).First()</h5>
<hr />
<div class="row">
    <div class="col-3">

    </div>
    <div class="col-3">
        Choose Number of Tickets
    </div>
</div>
<form asp-controller="PerformanceDetails" asp-action="AddToCart" method="post">

    @for (var i = 0; i < Model.Count; i++)
    {
        <div class="row">
            <div class="col-3">
                @Model[i].ZoneDescription <br />
                @Model[i].Price.ToString("C")
            </div>

            <select asp-for="@Model[i].NumberOfTickets" asp-items="Model[i].NumberSeatSelect"></select>
        </div>
        <hr />
    }
    <button type="submit" class="btn btn-sm btn-primary">Add to cart</button>
</form>

И мой контроллер:

public void AddToCart(PerformanceDetailsViewModel numTickets)
        {
            var text = numTickets;
        }

Вопрос - что я пропустил?Форма отображается нормально и содержит данные.Я видел примеры в разных местах, в которых говорилось, что используется цикл for, а не foreach, поэтому я делаю это, но моя модель все еще наталкивается на пустой провод, хотя я проверил инструменты Chrome Dev и вижу, что форма имеетданные.

Кроме того, я не знаю, использовать ли List<> для метода контроллера или нет.

Другим недостатком является кусок select asp-for, потому что он расширяется до множества html, но я не знаю, как это влияет на модель, поскольку каждый из них получает уникальное имя, которое не соответствуетназвание модели ...

Что я делаю не так?И что мне нужно исправить?

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Отвечая на мой собственный вопрос: вы не можете использовать asp-for="@Model[i].NumberOfTickets", потому что помощник по тегам преобразует его в [0].NumberOfTickets, то есть имя, которое ищет связыватель модели, и оно никогда не совпадет.Таким образом, вы вообще не можете использовать asp-for, вместо этого вам нужно разбить его до id="@Model[i].NumberOfTickets" name="NumberOfTickets", что понравится моделирующему переплету.И тогда ваши данные поступят.

Кроме того, необходимо обновить модель, чтобы получить список отдельных именных элементов, поэтому преобразуйте public int NumberOfTickets { get; set; } в public List<int> NumberOfTickets { get; set; }

0 голосов
/ 21 марта 2019

контроллер:

public void AddToCart(PerformanceDetailsViewModel numTickets)
{
   ViewData["text"] = numTickets;

   return View();
}

И используйте ViewData в вашем представлении

...