我正在修改ASP.NET MVC 4模板,并且需要有关如何设计复杂视图布局的指南。
我已经创建了一个模型,该模型正在获取SQL Server DB中存储过程返回的数据。视图从IEnumerable<>
对象的模型中获取数据。如果要查看存储过程的原始输出,它将看起来像这样:
**Name** **Objects**
John Orange
John Banana
John Apple
我使用了一个视图模板根据以下逻辑创建了一个简单的表,但是正如预期的那样,它的呈现方式与存储在IEnumerable<>
对象中的方式完全相同。该名称出现在表的输出的每一行上,如上。
@model IEnumerable<projectname.Models.ObjectsModel>
<table class="table">
...
...
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Objects)
</td>
...
相反,我想创建一个非表格形式的视图布局,该视图布局将名称显示为标题,将对象显示为项目符号列表,以及其他位置的其他属性,没有冗余数据 >。我的问题是,如果我使用IEnumerable<>
在@foreach (var item in Model)
中显示项目,由于Name
字段中的值不是唯一的,最终会得到三个重复的条目。
做到这一点的“最佳做法”是什么?有人可以指出正确的方向吗?
答案 0 :(得分:1)
不确定您的控制器是什么样的,甚至不确定您的视图模型,但也许我可以为您指出正确的方向。
foreach
只是一个对象循环,应仅用于此目的,我已经看到很多人操纵foreach
循环几乎没有成功或没有成功,您应该使用{{1} }循环。此外,for循环比foreach循环快大约2倍,因为它只需为列表中的每个元素调用@for
。
有几种方法可以编译所需的内容,一种方法是通过在控件或视图模型中使用LINQ传递正确的数据,上述@colinD。另一种方法类似于以下内容。
get_Item
我尚未测试代码,但我希望这可以帮助您获得所需的正确解决方案。
答案 1 :(得分:1)
我要弄清楚的主要事情是如何显示此数据 无需生成@foreach(模型中的var项)循环 SP输出中的每一行都有重复的条目。
通常像在对数据分组一样,在action
中处理数据,然后进行一些循环以显示。您想避免使用@foreach
时,我想使用linq。这只是一个想法,但请记住,您应该在MVC中分开关注点。希望对您有所帮助;)
IEnumerable<ObjectsModel> model = new List<ObjectsModel>()
{
new ObjectsModel(){ Name = "John", Objects = "Orange" },
new ObjectsModel(){ Name = "John", Objects = "Banana" },
new ObjectsModel(){ Name = "John", Objects = "Apple" }
};
var htmlModel = model
.GroupBy(a => a.Name)
.Select(a => new
{
Name = a.Key,
GroupObjects = string.Join("", a.Select(b => $"<li>{b.Objects}</li>"))
})
.Select(a => $"<h1>{a.Name}</h1><ul>{a.GroupObjects}</ul>")
.ToList();
var result = string.Join("", htmlModel); // <h1>John</h1><ul><li>Orange</li><li>Banana</li><li>Apple</li></ul>
最终结果:
<h1>John</h1>
<ul>
<li>Orange</li>
<li>Banana</li>
<li>Apple</li>
</ul>