【问题标题】:asp.net mvc - creating complex view based on stored procedureasp.net mvc - 基于存储过程创建复杂视图
【发布时间】:2019-09-06 23:26:37
【问题描述】:

我正在修改 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>
...

相反,我想创建一个非表格形式的视图布局,它将名称显示为标题,对象显示为项目符号列表,以及其他地方的其他属性,没有冗余数据。我的问题是,如果我使用@foreach (var item in Model) 显示IEnumerable&lt;&gt; 中的项目,我最终会得到三个重复的条目,因为Name 字段中的值不是唯一的。

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

【问题讨论】:

  • 将上面代码中的&lt;tr&gt;&lt;td&gt; 标签更改为&lt;ul&gt;&lt;li&gt; 标签,或多或少?
  • 不要使用@Html.DisplayFor 在你想要的一些HTML结构中使用@item.&lt;property&gt;&lt;h1&gt;@item.Name&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;@item.Objects&lt;/li&gt;&lt;/ul&gt;
  • 感谢您的建议。我想弄清楚的主要事情是如何在不让@foreach (var item in Model) 循环为 SP 输出中的每一行生成重复条目的情况下显示这些数据。
  • 您的意思是要按名称对结果进行分组吗?如果是这样,我想您可以在视图中或之前使用 LINQ 来做到这一点。
  • 如果您在此处包含所需的输出 HTML 标记可能会有所帮助。 “其他地方的其他属性”到底是什么意思?

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我想弄清楚的主要事情是如何显示这些数据 没有@foreach(模型中的变量项)循环生成 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2014-11-13
      • 2011-12-04
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多