Итерация по списку ViewModel - PullRequest
0 голосов
/ 29 января 2019

Я работаю над веб-приложением, использующим Asp.Net Core 2.2 MVC и Entity Framework, с которым я довольно плохо знаком.

Я пытаюсь выполнить процесс, в результате которого пользователь создает инцидент и представляетсяс вопросом, если ответ «да», страница загрузится, но если ответ «нет», появится следующий вопрос.

Я использую модель представления для сохранения своих вопросов в виде списка.Как лучше всего возвращать первый вопрос, чтобы я мог повторять каждый из них при нажатии кнопки?

Моя модель представления выглядит следующим образом:

public class PathwayViewModel
{
    public List<StageQuestion> StageQuestion{ get; set; }
    public Incident Incident { get; set; }
}

и мой класс модели StageQuestion имеет видследует

public class StageQuestion
{
    // PK
    public int Id { get; set; }
    // FK to Incident Type
    public int IncidentTypeId { get; set; }
    // FK to Stage
    public int StageId { get; set; }
    public string QuestionText { get; set; }

    public virtual IncidentType IncidentType { get; set; }
    public virtual Stage Stage { get; set; }
}

Мой метод контроллера следующий:

public IActionResult Pathway (int? id)
{
    PathwayViewModel path = new PathwayViewModel();
    var incident = _context.Incident
        .Include(i => i.IncidentType)
        .FirstOrDefault(m => m.Id == id);
    path.Incident = incident;
    var stageQuestions = _context.StageQuestion.Where(x => x.IncidentTypeId == incident.IncidentTypeId)
        .Include(s => s.Stage)
        .Include(o => o.Stage.Outcome)
        .ToList();
    path.StageQuestion = stageQuestions;
    return View(path);
}

Мой HTML выглядит следующим образом:

@model Path2019.ViewModels.PathwayViewModel

@{
    ViewData["Title"] = "Pathway";
 }

<h1>Pathway</h1>

<table class="table">
   <thead>
       <tr>
          <th>
            Stage text
        </th>
        <th>
            Question Text
        </th>
        <th>
            Type of Incident
        </th>
        <th></th>
    </tr>
</thead>
<tbody>
    @foreach (var item in Model.StageQuestion)
    {
    <tr>
        <td>
            @Html.DisplayFor(ModelItem => item.Stage.StageName)
        </td>
        <td>
            @Html.DisplayFor(ModelItem => item.QuestionText)
        </td>
        <td>
            @Html.DisplayFor(ModelItem => item.IncidentType.Type)
        </td>
    </tr>
    }
</tbody>
</table>

1 Ответ

0 голосов
/ 30 января 2019

Каков наилучший способ возврата первого вопроса, который я могу перебирать каждый раз при нажатии кнопки?

По-прежнему неясно, какой у вас сценарий.ваше описание, я предполагаю, что вы хотите показать StageQuestion один за другим при нажатии кнопки Next.Если вы хотите отфильтровать данные на стороне сервера, вы можете создать ссылку действия:

@Html.ActionLink("Next", "Pathway", new { index = ViewBag.NextIndex })

и изменить модель представления, включив в нее один вопрос:

public class PathwayViewModel
{           
    public StageQuestion StageQuestion { get; set; }
}

Затем выполните записьна стороне сервера:

public ActionResult Pathway(int? id,int? index)
{
    int currentIndex = index.GetValueOrDefault();
    if (currentIndex == 0)
    {
        ViewBag.NextIndex = 1;
    }
    else
    {
        ViewBag.NextIndex = index + 1;
    }

    ........

    PathwayViewModel path = new PathwayViewModel();
    var stageQuestion = _context.StageQuestion.Where(x => x.IncidentTypeId == incident.IncidentTypeId)
    .Include(s => s.Stage)
    .Include(o => o.Stage.Outcome).OrderBy(x=>x.Id).Skip(currentIndex).Take(1).FirstOrDefault();

    path.StageQuestion = stageQuestion;



    return View(path);
}

С помощью приведенного выше кода вы также должны добавить ниже две логики:

  1. Также создайте viewbag и сохраните текущий идентификатор инцидента, также добавьте значение идентификатора к @Html.ActionLink
  2. Добавьте логику, чтобы подтвердить, является ли текущий индекс последней записью в базе данных, вы можете получить максимальное количество записей и сравнить их.

Если приведенный выше пример кода не соответствуетВаше требование, пожалуйста, дайте мне знать.

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