簡體   English   中英

asp.net mvc-基於存儲過程創建復雜的視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM