asp.net mvc - создание сложного представления на основе хранимой процедуры - PullRequest
1 голос
/ 16 апреля 2019

Я работаю с шаблоном ASP.NET MVC 4, и мне нужно руководство по проектированию макета сложного вида.

Я уже создал модель, которая получает данные, возвращаемые хранимой процедурой в БД SQL Server.Представление получает данные из модели в объекте 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<>, используя @foreach (var item in Model), я получаю три дубликата записи, поскольку значения в поле Name не являются уникальными.

Что такоеспособ «лучшей практики» для этого? Может кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Главное, что я пытаюсь выяснить, это как отобразить эти данные. без создания цикла @foreach (var item in Model) повторяющиеся записи для каждой строки в выводе 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>
1 голос
/ 17 апреля 2019

Не уверен, как выглядит ваш контроллер или даже модель вашего вида, но, возможно, я могу указать вам правильное направление.

foreach - это просто цикл объектов, и его следует использовать только для этого, я видел, как многие люди манипулируют циклами foreach с небольшим успехом или безуспешно. Вы должны использовать цикл @for.кроме того, цикл for примерно в 2 раза быстрее цикла foreach, поскольку для каждого элемента в списке он должен вызывать get_Item.

есть несколько способов выполнить то, что вы хотите, в одну сторонубыло бы то, что @colinD указано выше, используя LINQ в контроллере или viewmodel для передачи правильных данных.другой способ будет выглядеть примерно так:

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

Я не тестировал код, но надеюсь, что это поможет вам найти правильное решение, которое вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...