У меня есть 3 связанных таблицы, Table1 => Table2 => Table3 Отношения такого типа.
У меня есть данные из таблицы 1 и таблицы 2, потому что у меня есть модель для отображения из таблицы 1, теперь моя проблема в таблице 3, я не могу получить данные для отображения. Мне нужно показать данные в деталях, и мой проект предназначен для опросов.
Код контроллера по умолчанию:
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; }
}
Вы используете Entity Framework для вызова db.Questions, который создаст объект вопроса на основе предоставленного идентификатора. Есть ли у этой сущности доступ к ответам? Действительно ли Entity Framework построил этот подобъект?
Поскольку я новичок в MVC, можете ли вы помочь мне найти лучшее решение?
Можете ли вы разместить все свои модели здесь?
Этот вопрос оооочень далек от завершения, и существует так много способов сделать это (MVC, шаблоны MVVM, репозиторий, UoW). где в коде отсутствуют другие серьезные недостатки в понимании (объединения EF, объединения, перекрестное применение, автосопоставление,...)
Я обновил вопрос с моделями
Несколько советов по исследованию: Entity Framework — это мощное средство, но вы определяете контекст, чтобы он мог сопоставляться с вашей сущностью. Но интерфейсные данные или данные представления не часто представляют сущность или совокупность данных, поэтому чаще всего вам необходимо отобразить или расширить способ преобразования данных во внешнее представление.
@Hien Nguyen Модели размещены в вопросе. У вас есть решение?
Можете ли вы прикрепить экран, который вы хотите?





Начну с некоторых определений:
@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» для получения более подробной информации.
Совет: не используйте объекты сущностей EF в качестве ViewModels.