Почему мой связанный список <T>возвращает пустой, используя цикл foreach для отображения значений на странице бритвы? - PullRequest
2 голосов
/ 27 июня 2019

На моей странице бритвы PageModel у меня есть свойство List<T>:

[BindProperty]
public List<JobCard> CustomerSpecificJobCards { get; set; }

Вот модель JobCard:

public partial class JobCard
{
    public int JobCardId { get; set; }
    public string Products { get; set; }
    public string CusCode { get; set; }
    public string Category { get; set; }
    public bool IsAssigned { get; set; }
}

Список JobCards заполняется после того, как пользователь публикует номер заказа со страницы:

CustomerSpecificJobCards = AllJobCards.Where(jc => jc.CusCode == WorkOrderInfo.MarkForCusCode).ToList();

Затем он отображается в форме на странице бритвы через цикл foreach:

@foreach (var card in Model.CustomerSpecificJobCards)
{
    <div class="col-1"><input asp-for="@card.IsAssigned" /></div>
    <div class="col-9">@card.Products</div>
    <div class="col-2">@card.JobCardId</div>
}

Пользователям показывается список рабочих мест и флажок. После проверки пользователь отправляет выбор. Когда я смотрю на публикуемые CustomerSpecificJobCards, список пуст. Зачем? Основываясь на информации здесь Я решил изменить цикл foreach на цикл for:

@for (var card = 0; card < Model.CustomerSpecificJobCards.Count; card++)
{
    <div class="col-1"><input asp-for="@Model.CustomerSpecificJobCards[card].IsAssigned" /></div>
    <div class="col-9">@Model.CustomerSpecificJobCards[card].Products</div>
    <div class="col-2">@Model.CustomerSpecificJobCards[card].JobCardId</div>
}

[EDIT] Первоначально я думал, что все значения были возвращены с помощью цикла for, но оказалось, что возвращаются только значения .IsAssigned ... Products и JobCardId пусты. Я использую Razor Pages впервые. Что я делаю не так?

[Followup] Прочитав ответ Рафалона, я нашел это объяснение связывания сложной коллекции с флажками в цикле for или foreach. Плюс еще одна отличная ссылка на привязку данных .

1 Ответ

0 голосов
/ 27 июня 2019

Краткий ответ: проверьте сгенерированный HTML для for и foreach, и вы увидите, что с foreach вы не можете ожидать, что форма вернет List правильно (с помощником asp-for).

for необходимо, чтобы получить индексируемые входные данные, выглядящие так:

<input name='CustomerSpecificJobCards[0].IsAssigned'
         id='CustomerSpecificJobCards_0__IsAssigned' />

Вы все еще можете сделать это с foreach, но без asp-for это довольно утомительно, иВаша модель должна удовлетворять некоторым требованиям (например, иметь свойство индекса).


Другая проблема связана с тем, что @Model.CustomerSpecificJobCards[card].Products является только текстовым.

Поэтому вам следует либозамените его на input, точно так же как IsAssigned, иначе вы можете добавить скрытый ввод:

<input type="hidden" asp-for="Model.CustomerSpecificJobCards[card].Products" />

То же самое относится к JobCardId.

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