c# - 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
字段中的值不是唯一的。
执行此操作的“最佳实践”方法是什么?有人可以指出我正确的方向吗?
解决方案
不确定您的控制器是什么样子,甚至您的视图模型,但也许我可以为您指明正确的方向。
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>
}
我还没有测试过代码,但我希望这可以帮助您获得您正在寻找的正确解决方案。
推荐阅读
- ckeditor4.x - CKeditor 4 证明字体和颜色不能一起工作
- android - 如何为新的 android 版本设置更新优先级
- html - 部分元素是否考虑它们的顺序?
- php - 如何使用 PHP 编辑对象数组中的对象属性?
- node.js - 从前端请求数据时如何在nodejs中切换远程数据库?
- python - 无法登录 localhost:8000/admin ... ERR_CONNECTION_REFUSED
- python - 如何获得情节的最终轴?
- python - 我们在 PySpark 程序中在哪里注册驱动程序?
- c++ - Q:: 谁能更详细地解释一下程序中的“传递值”?
- redirect - React-Router 触发 Redirect 而不是指定的 Route