首页 > 解决方案 > asp.net mvc - 基于存储过程创建复杂视图

问题描述

我正在修改 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<>using中显示项目,@foreach (var item in Model)我最终会得到三个重复的条目,因为该Name字段中的值不是唯一的。

执行此操作的“最佳实践”方法是什么?有人可以指出我正确的方向吗?

标签: c#asp.netsql-serverasp.net-mvcbootstrap-4

解决方案


不确定您的控制器是什么样子,甚至您的视图模型,但也许我可以为您指明正确的方向。

foreach只是一个对象循环,应该用于此目的,我见过很多人操作foreach循环很少或没有成功,你应该使用@for循环。此外 for 循环比 foreach 循环快大约 2 倍,因为它只需要调用get_Item列表中的每个元素。

有几种方法可以满足您的需求,一种方法是上面提到的@colinD,方法是在控制器或视图模型中使用 LINQ 来传递正确的数据。另一种方式将类似于以下内容。

var models = ObjectsModel();
    var grouped = models.GroupBy(s => s.ObjectsModel.Name)
    .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().ObjectsModel.Name)</h2>
    <ul>
        for(int j = 0; j < Model[i].Count; j++)
        {
        <li>@Html.DisplayFor(model => model[i][j].Object)</li>
        }
    </ul>
    }

我还没有测试过代码,但我希望这可以帮助您获得您正在寻找的正确解决方案。


推荐阅读