Мне нравится этот подход, потому что он делает код в моем представлении простым - в основном у меня есть @foreach для ответов, вложенных в @foreach для вопросов.
Лично яне был бы удовлетворен этим.Зачем писать циклы в вашем представлении, когда вы можете использовать Display Temapltes?Что касается вашего вопроса о включении количества голосов сегодня, количества голосов на этой неделе и количества голосов в целом, ответ, как всегда, заключается в использовании модели представления, которая специально адаптирована к потребностям представления:
public class QuestionViewModel
{
public int VotesToday { get; set; }
public int VotesThisWeek { get; set; }
public int TotalVotes { get; set; }
public IEnumerable<ResponseViewModel> { get; set; }
}
тогда вы передадите IEnumerable<QuestionViewModel>
вашему представлению, и оно будет выглядеть так:
@model IEnumerable<AppName.Models.QuestionViewModel>
@Html.DisplayForModel()
и в ~/Views/Shared/DisplayTemplates/QuestionViewModel.cshtml
@model AppName.Models.QuestionViewModel
<div>@Model.VotesToday</div>
<div>@Model.VotesThisWeek</div>
<div>@Model.TotalVotes</div>
@Html.DisplayFor(x => x.ResponseViewModel)
и в~/Views/Shared/DisplayTemplates/ResponseViewModel.cshtml
:
@model AppName.Models.ResponseViewModel
<div>@Model.Body</div>
Теперь это чистый вид.
Давайте теперь перейдем к контроллеру:
public class QuestionsController: Controller
{
private readonly IQuestionsRepository _repository;
public QuestionsController(IQuestionsRepository _repository)
{
_repository = repository;
}
public ActionResult Index()
{
IEnumerable<Question> model = _repository.GetQuestions();
IEnumerable<QuestionViewModel> viewModel = Mapper
.Map<IEnumerable<Question>, IEnumerable<QuestionViewModel>>(model);
return View(viewModel);
}
}
Здесь мы абстрагировали доступ к данным в хранилище, чтобы контроллер никогда не знал ничего о EF или какой-либо другой технологии доступа к данным, которой вы являетесь.с помощью.Контроллер должен знать только о вашей модели, вашей модели представления и абстракции о том, как манипулировать моделью (в данном случае интерфейсе репозитория).
Что касается преобразования между вашей моделью и моделью представленияВы можете использовать AutoMapper (в моем примере это Mapper.Map<TSource, TDest>
).
Что касается хранилища, то это деталь реализации: выполняете ли вы один или три запроса к вашей базе данныхтебе решать.Все, что вам нужно, - это то, что вы способны собирать необходимую информацию.