Я не думаю, что проблема заключается в использовании List
вместо ICollection
.
- Чтение: вы можете использовать
@foreach
или @for()
для итерации элементов в коллекции.
- Проводка: это при использовании
@foreach
с HtmlHelper
или TagHelper
для генерации входных данных внутри формы, не будет работать, потому что @foreach
приведет к идентичным идентификаторам для этих входных данных. Следовательно, вы должны использовать @for()
с индексом.
Я также вижу, что вы использовали @Html.DisplayFor()
. Я полагаю, вы знаете, что делаете. @Html.DisplayFor()
отобразит шаблоны с именем DisplayTemplates
, которые соответствуют типу свойства.
Например, предполагая, что свойство Title
является String
, если вы определили View с именем String.cshtml
внутри папки DisplayTemplates
представления, вызов @Html.DisplayFor(x => x.Title)
будет использовать этот шаблон для визуализации этого свойства .
String.cshtml
@model string
@if (String.IsNullOrEmpty(Model))
{
<!-- You can render different HTML elements here -->
}
else
{
<!-- You can render different HTML elements here -->
}
Обычно я не использую @Html.DisplayFor()
для создания элементов формы. Вместо этого я бы просто использовал конкретные HTML-помощники или теги-помощники для создания определенных типов ввода. Например, для создания текстовых полей используйте @Html.TextBoxFor()
или <input type="text" asp-for="xxx" />
. Для построения текстовых областей используйте @Html.TextAreaFor()
или <textarea asp-for="xxx"></textarea>
.
Мне просто нравится явно объявлять / определять элементы ввода.
Пример формы с использованием помощника по тегам (написано от руки, не проверено):
@model Games
<!-- asp-area, asp-controller, asp-action are tag helpers on the form -->
<form asp-area="" asp-controller="game" asp-action="manage">
<!-- hidden type input for the Id? -->
<input type="hidden" asp-for="Id" />
<dl>
<dt>
<label asp-for="Title"></label>
</dt>
<dd>
<input type="text" asp-for="Title" />
</dd>
<dt>
<label asp-for="Details"></label>
</dt>
<dd>
@for(int i = 0; i < Model.Details.Count(); i++)
{
<label asp-for="Details[i].MakeUpProperty1"></label>
<!-- textbox for property 1? -->
<input type="text" asp-for="Details[i].MakeUpProperty1" />
<label asp-for="Details[i].MakeUpProperty2"></label>
<!-- number type input box for property 2? -->
<input type="number" asp-for="Details[i].MakeUpProperty2" />
<!-- dropdown for property 3? -->
<select asp-for="Details[i].MakeUpProperty3"
asp-items="Model.AvailableProperty3List.ToSelectListItem()" ></select>
}
</dd>
</dl>
</form>