我试图写一个foreach循环会发现每个不同的类别类型,然后列出每个带有该类别分配标题。
例如:
@model IEnumerable<CMESurvey.Models.SurveyProgramModel>
@{
ViewBag.Title = "Home";
}
@foreach (var item in Model) {
<h2>@Html.DisplayFor(modelItem => item.ProgramType.ProgramType)</h2>
foreach (var listing in Model)
{
<ul>
<li>@Html.DisplayFor(modelItem => listing.ProgramTitle)</li>
</ul>
}
}
调查响应模型:
public class SurveyProgramModel
{
[Key]
public int ProgramId { get; set; }
public int ProgramYear { get; set; }
public int ProgramStatusId { get; set; }
public string ProgramTitle { get; set; }
public virtual SurveyProgramModel SurveyProgramModel { get; set; }
public virtual PersonModel PersonModel { get; set; }
}
我遇到了2个问题。
1)我需要它来只显示每个类别一次,而不是列出类别每个项目实例。
2)它显示了所有ProgramTitle,而不是仅仅在该ProgramTitle该循环。
不知道我应该使用语法。
如果我理解正确的话,那么它应该像
@foreach (var item in Model) {
<h2>@Html.DisplayFor(modelItem => item.ProgramType.ProgramType)</h2>
foreach (var listing in item.SurveyResponseModels)
{
<ul>
<li>@Html.DisplayFor(modelItem => listing.ProgramTitle)</li>
</ul>
}
}
它看起来像你需要按PROGRAMTYPE您枚举在您的控制器。 这将保持视图非常干净。
IEnumerable<CMESurvey.Models.SurveyProgramModel> models = Foo(); //however you got them...
var grouped = models.GroupBy(s => s.ProgramType.ProgramType);
return View(grouped);
然后,你的看法是要简单得多。 (当您修复模型的类型)。
@for(int i = 0; i < Model.Count; i++)
{
<h2>@Html.DisplayFor(model => model[i].Key)</h2>
<ul>
for(int j = 0; j < Model[i].Count; j++)
{
<li>@Html.DisplayFor(model => model[i][j].ProgramTitle)</li>
}
</ul>
}
替代方案:
或者,你做一个列表的列表:
var models = Foo();
var grouped = models.GroupBy(s => s.ProgramType.ProgramType)
.Select(x => x.Select(y => y))
.ToList();
return View(grouped);
那么你的看法略有改变:
@for(int i = 0; i < Model.Count; i++)
{
<h2>@Html.DisplayFor(model => model[i].First().ProgramType.ProgramType)</h2>
<ul>
for(int j = 0; j < Model[i].Count; j++)
{
<li>@Html.DisplayFor(model => model[i][j].ProgramTitle)</li>
}
</ul>
}