Как получить результаты в представлении из 3 таблиц в MVC

У меня есть 3 связанных таблицы, Table1 => Table2 => Table3 Отношения такого типа.

У меня есть данные из таблицы 1 и таблицы 2, потому что у меня есть модель для отображения из таблицы 1, теперь моя проблема в таблице 3, я не могу получить данные для отображения. Мне нужно показать данные в деталях, и мой проект предназначен для опросов.

  1. Таблица 1 = Вопросы (Ключ QID)
  2. Таблица 2 = Варианты ответов (ключ ANID, а q_ID — ключ к вопросам)
  3. Таблица 3 = Результаты (подсчет голосов) (ключ — RID, а ans_ID — ключ к AnswerOption)

Код контроллера по умолчанию:

 public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }



            Questions questions= db.Questions.Find(id);
            if (questions== null)
            {
                return HttpNotFound();
            }




            return View(questions);
        }

ПОСМОТРЕТЬ Код:

 @foreach (var item in Model.Answers)
        {

            if (item != null)
            {
        <tr>
            <td>
                @Html.DisplayFor(x => item.AnswerName)
            </td>
            <td>
                @Html.DisplayFor(x => item.Results.Result)
            </td>

        </tr>
            }

ТИПОВЫЕ ВОПРОСЫ:

public class Questions
    {
        public Questions()
        {
            Answers= new HashSet<Answers>();

        }
        [Key]
        public  int QID { get; set; }
        public string Prasanje { get; set; }
        public bool pubOdg { get; set; }
        public int? avtor { get; set; }

        public virtual ICollection<Answers> Answers { get; set; }

       [ForeignKey("avtor")]
        public virtual tbl_useri tbl_useri { get; set; }

    }

ОТВЕТЫ ОБРАЗЦОВ:

 public Answers()
        {
            Results= new HashSet<Results>();
        }

        [Key]
        public int ANID{ get; set; }

        public int q_ID{ get; set; }


        public string Odgovor { get; set; }
        public string kreator { get; set; }
        public int? rCount { get; set; }

        [ForeignKey("q_ID")]
        public virtual Questions Questions{ get; set; }

        public virtual ICollection<Results> Results{ get; set; }

РЕЗУЛЬТАТЫ МОДЕЛИ:

 public class Results
    {
        [Key]
        public int RID{ get; set; }
        public int ans_ID{ get; set; }
        public int Result{ get; set; }


        [ForeignKey("ans_ID")]
        public virtual Answers Answers { get; set; }

    }

Совет: не используйте объекты сущностей EF в качестве ViewModels.

Dai 19.03.2019 23:19

Вы используете Entity Framework для вызова db.Questions, который создаст объект вопроса на основе предоставленного идентификатора. Есть ли у этой сущности доступ к ответам? Действительно ли Entity Framework построил этот подобъект?

Greg 19.03.2019 23:19

Поскольку я новичок в MVC, можете ли вы помочь мне найти лучшее решение?

Xelmep 19.03.2019 23:21

Можете ли вы разместить все свои модели здесь?

Hien Nguyen 19.03.2019 23:24

Этот вопрос оооочень далек от завершения, и существует так много способов сделать это (MVC, шаблоны MVVM, репозиторий, UoW). где в коде отсутствуют другие серьезные недостатки в понимании (объединения EF, объединения, перекрестное применение, автосопоставление,...)

Austin T French 19.03.2019 23:29

Я обновил вопрос с моделями

Xelmep 19.03.2019 23:31

Несколько советов по исследованию: Entity Framework — это мощное средство, но вы определяете контекст, чтобы он мог сопоставляться с вашей сущностью. Но интерфейсные данные или данные представления не часто представляют сущность или совокупность данных, поэтому чаще всего вам необходимо отобразить или расширить способ преобразования данных во внешнее представление.

Greg 19.03.2019 23:32

@Hien Nguyen Модели размещены в вопросе. У вас есть решение?

Xelmep 20.03.2019 08:32

Можете ли вы прикрепить экран, который вы хотите?

Hien Nguyen 21.03.2019 01:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
123
1

Ответы 1

Начну с некоторых определений:

  • модель представления — это тип, представляющий данные, специфичные для конкретного визуализированного представления. Действие контроллера должно создать этот объект и заполнить его загруженными данными, а затем передать его в представление.
    • Это лежит в основе разделения интересов в ASP.NET MVC и ASP.NET Core и является общим шаблоном проектирования во всех современных (после 2005 г.) средах веб-программирования.
    • Сравните это со старой школой PHP/CGI/классического ASP-программирования, где код базы данных смешивается с HTML.
    • В веб-программировании View-Model обычно представляет собой объект ненаблюдаемый, неизменный и эфемерный, который существует только в течение срока действия HTTP-запроса. Принимая во внимание, что в настольном программировании (например, WPF, UWP XAML и т. д.) модель представления обычно наблюдаемый, изменчивый и долгоживущий).
  • Класс модель (отличный от модель представления) или класс организация — это объект, представляющий данные из резервной базы данных. (Игнорируйте тот факт, что Razor использует ключевое слово @model для обозначения модели представления).

(Я разочарован и раздражен тем, что большинство руководств для начинающих по ASP.NET MVC и ASP.NET Core по-прежнему знакомят пользователей с анти-шаблоном использования типов сущностей Entity Framework в качестве моделей представлений. Эти руководства должны научить читателей использовать отдельные модели просмотра, чтобы избежать увода читателей по неправильному пути и возможной путаницы, как это OP Использование сущностей EF в качестве моделей просмотра также приводит к проблемам безопасности, поскольку позволяет злоумышленнику сбрасывать пароли других пользователей (например), если есть неадекватные проверка входных запросов (для чего, например, [BindNever]). Я хочу сказать: просто не.)

Обратно по теме:

Если это одностороннее представление (т. е. вы показываете только данные из своей базы данных, не позволяя пользователю редактировать эти данные в <form>), тогда определите новый класс как вашу модель представления и заполните его данными вашей сущности в качестве свойств. .

В вашем случае ваше действие контроллера QuestionsController::Details, поэтому у меня было бы так:

public class DetailsViewModel
{
    // One-way members:

    [BindNever]
    public String PageTitle { get; internal set; }

    public Question TheQuestion  { get; internal set; }

    public List<Answer> TheAnswers { get; internal set; }

    // Two-way members:

    // (you don't have any forms, so this area is empty)
}

Затем измените действие контроллера, чтобы создать, заполнить и вернуть этот тип модели представления:

public async IActionResult Details(Int32? id)
{
    if ( id == null ) return this.NotFound();

    Question question = await this.db.Questions.SingleOrDefaultAsync( id.Value );
    if ( question == null ) return this.NotFound();

    DetailsViewModel vm = new DetailsViewModel()
    {
        PageTitle = "Details for " + question.Title,
        TheQuestion = question,
        TheAnswers = await this.db.Answers.Where( q => a.Question == question ).ToListAsync()
    };

    return this.View( model: vm );
}

И измените представление Razor, чтобы использовать эту модель представления:

@model DetailsViewModel

<html>
<head>
<title>@Model.PageTitle</title>
</head>
<body>

<h2>Question</h2>

<p>@Model.TheQuestion.QuestionText</p>

<h2>Answers</h2>

@foreach( Answer ans in this.Model.TheAnswers )
{
<h3>Answer @ans.Name</h3>

    @foreach( Result result in ans.Results )
    {
<h3>@result.Name</h3>
    }
}

</body>
</html>

Если вы хотите разрешить пользователям редактировать данные в POST в <form>, вам нужно будет по существу определить новые классы для каждой строки таблицы, которую вы хотите, чтобы пользователи могли редактировать. Но это выходит за рамки вашего первоначального вопроса, но поищите в Интернете «привязку модели ASP.NET mvc» для получения более подробной информации.

Другие вопросы по теме