Доступ к дочерней коллекции в ракурсах MVC5 из модели - PullRequest
0 голосов
/ 08 мая 2018

У меня сейчас проблема с попыткой получить доступ к дочерним коллекциям в моих моделях.

Моя модель выглядит следующим образом (имейте в виду, что я вычеркнул много значений, моя модель не такая уж маленькая):

public class Games
{
    public int Id { get; set; }
    public string Title { get; set; }
    public ICollection<GameDetails> Details { get; set; }
}

Теперь я могу легко получить данные в моем контроллере, используя простой запрос linq и включая дочерние данные (в данном случае «детали»).

Однако я изо всех сил пытаюсь понять, как я могу получить доступ к этим данным как для публикации, так и для чтения, когда они возвращаются на мой взгляд.

Мой взгляд выглядит так:

<dt>
        @Html.DisplayNameFor(model => model.Title)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.Title)
    </dd>
    <dt>
        @Html.DisplayNameFor(model => model.Details)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.Details)
    </dd>

Но, похоже, я не могу получить доступ к данным внутри дочерней коллекции.

Я пробовал модель. Детали. но я не могу получить доступ к данным в дочерней коллекции.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Я не думаю, что проблема заключается в использовании 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>
0 голосов
/ 08 мая 2018

Используйте цикл @for со списком

@for (int i = 0; i < model.Details.Count(); i++)
{
    <dt>
        @Html.DisplayNameFor(model => model.Details[i].Title)
    </dt>
    ...
}

Было бы лучше использовать List в вашей модели, а не ICollection - поэтому модель представления содержит полный список отображаемых элементов.

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