asp.net mvc-基于存储过程创建复杂的视图

时间:2019-04-16 19:22:56

标签: c# asp.net sql-server asp.net-mvc bootstrap-4

我正在修改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字段中的值不是唯一的,最终会得到三个重复的条目。

做到这一点的“最佳做法”是什么?有人可以指出正确的方向吗?

2 个答案:

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