[英]asp.net mvc - creating complex view based on stored procedure
我正在修改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>
...
相反,我想創建一個不是表格形式的視圖布局,該視圖布局將Name顯示為標題,將對象顯示為項目符號列表,並在其他位置顯示其他屬性, 而沒有多余的數據 。 我的問題是,如果我使用@foreach (var item in Model)
IEnumerable<>
顯示項目,由於Name
字段中的值不是唯一的,我最終會得到三個重復的條目。
什么是“最佳實踐”方法? 有人可以指出正確的方向嗎?
不知道您的控制器是什么樣子,甚至不知道您的視圖模型,但是也許我可以為您指出正確的方向。
foreach
只是對象的循環,應用於此目的,我已經看到許多人操縱foreach
循環很少成功或沒有成功,您應該使用@for
循環。 此外,for循環比foreach循環快大約2倍,因為它只需要為列表中的每個元素調用get_Item
。
有幾種方法可以滿足您的需要,一種方法就是通過在控件或視圖模型中使用LINQ傳遞正確的數據,上述@colinD。 另一種方法類似於以下內容。
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>
}
我尚未測試代碼,但希望這可以幫助您獲得所需的正確解決方案。
我要弄清楚的主要事情是如何顯示此數據,而不必讓@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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.