从模型

时间:2018-05-08 14:36:55

标签: razor model-view-controller asp.net-core-2.0

我目前在尝试访问模型中的子集合时遇到问题。

我的模型如下所示(请记住我已经删除了很多值,我的模型不是那么小):

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

现在,我可以使用简单的linq查询轻松获取控制器中的数据,并包含子数据(在本例中为&#39;详细信息&#39;)。

然而,我很难看到我如何能够发布这些数据以及在传回我的视图时阅读它。

我的观点如下:

<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>

但似乎我无法访问子集合中的数据。

我试过过model.Details。但我无法访问子集合中的数据。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

使用带有列表的@for循环

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

最好在模型中使用List,而不是ICollection - 因此视图模型包含要显示的项目的确定列表。

答案 1 :(得分:1)

我认为问题不在于使用double[][] inputs = sourceMatrix.GetColumns(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }).ToJagged(); 而不是List

  • 阅读:您可以使用ICollection@foreach来迭代集合中的项目。
  • 发布:这是因为使用@for()@foreachHtmlHelper生成表单内的输入将无效,因为TagHelper将为这些输入生成相同的ID。因此,您必须使用带有索引的@foreach

我也看到你使用了@for()。我假设你知道你在做什么。 @Html.DisplayFor()将呈现与属性类型匹配的名为@Html.DisplayFor()的模板。

例如,假设属性DisplayTemplatesTitle,如果您在视图的String文件夹中定义了名为String.cshtml的视图,则调用DisplayTemplates将使用该模板为该属性进行渲染。

<强> String.cshtml

@Html.DisplayFor(x => x.Title)

我通常不使用@model string @if (String.IsNullOrEmpty(Model)) { <!-- You can render different HTML elements here --> } else { <!-- You can render different HTML elements here --> } 来构建表单元素。相反,我只会使用特定的HTML帮助程序或标记帮助程序来构建特定的输入类型。例如,要构建文本框,请使用@Html.DisplayFor()@Html.TextBoxFor()。要构建文本区域,请使用<input type="text" asp-for="xxx" />@Html.TextAreaFor()

我只想显式声明/定义输入元素。

使用标记帮助程序的示例表单(手写,未经测试):

<textarea asp-for="xxx"></textarea>