#asp.net #asp.net-mvc-3 #models
#asp.net #asp.net-mvc-3 #Модели
Вопрос:
Часть моего проекта использует опросы, и я использую EF для классов. У меня есть модели:
Опросы.cs
public class Poll
{
[Key]
public int ID { get; set; }
public string Title { get; set; }
[Column("creation_date")]
public DateTime CreationDate { get; set; }
[Column("expiration_date")]
public DateTime ExpirationDate { get; set; }
public virtual ICollection<PollOption> Options { get; set; }
public virtual ICollection<PollVote> Votes { get; set; }
}
PollOption.cs
[Table("PollsOptions")]
public class PollOption {
[Key]
public int ID { get; set; }
[Display(Name = "Poll")]
[Required(ErrorMessage = "Poll must be set.")]
[Column("poll_id")]
public int PollID { get; set; }
[Required(ErrorMessage = "Option's Text cannot be empty.")]
public string Text { get; set; }
[Editable(false)]
public int Votes { get; set; }
public virtual Poll Poll { get; set; }
}
PollVote.cs
[Table("PollsVotes")]
public class PollVote
{
[Key]
[Display(Name = "Player", Description = "Player that voted.")]
[Column("player_id", Order = 0)]
public int PlayerID { get; set; }
[Key]
[Display(Name = "Option", Description = "Option voted by the Player.")]
[Column("option_id", Order = 1)]
public int OptionID { get; set; }
public virtual Player Player { get; set; }
public virtual PollOption Option { get; set; }
}
Я хочу использовать его в таком представлении:
— Передать модель из контроллера, который содержит список опроса, подобный этому:
Poll[0]:
----PollTitle
----Options:
---- ----Option1 From Poll0
---- ----Option2 From Poll0
---- ----Option3 From Poll0
----Votes:
---- ----Vote1 for Option1 From User X
---- ----Vote2 for Option2 From User Y
---- ----Vote3 for Option3 From User Z
Poll[1]:
----PollTitle
----Options:
---- ----Option4 From Poll1
---- ----Option5 From Poll1
---- ----Option6 From Poll1
----Votes:
---- ----Vote1 for Option4 From User X
---- ----Vote2 for Option5 From User Y
---- ----Vote3 for Option6 From User Z
Как мне это сделать !?
Я надеюсь, вы понимаете… Спасибо!
Ответ №1:
Вот примерный готовый подход … настраивайте по мере необходимости
Вид:
@model IEnumerable<MvcApplication1.Models.Poll>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@if (Model == null)
{
@:No Polls to display.
}
else
{
foreach (var poll in Model)
{
@Html.DisplayFor(m => poll)
}
}
Шаблон отображения (views / shared/DisplayTemplates/Poll.cshtml)
(Если вы не сталкивались с этим, они очень полезны.)
@model MvcApplication1.Models.Poll
@Html.DisplayFor(model => model.Title)
Options:
@foreach (var option in Model.Options)
{
@Html.DisplayFor(m=> option.Text)
}
Votes:
@foreach (var vote in Model.Votes)
{
@Html.DisplayFor(m=> vote.Option)
}
Надеюсь, это поможет вам встать на правильный путь.
Комментарии:
1. Я не понял эту вещь DisplayTemplates, вы можете мне помочь?
2. Конечно, этот пост немного устарел, и примеры основаны на MVC2 и движке webforms (а не razor), но он все еще действителен. bradwilson.typepad.com/blog/2009/10 /…
3. На самом деле то, что я хочу сделать, это иметь модель, которая содержит все это. Я имею в виду, что модель опроса содержит заголовок (модель), а также список <Голосов> (модель). А затем в представлении я просто использую его просто как свойство. Возможно ли это? Я хочу, чтобы опрос модели связывал все его свойства. Я не хочу использовать отдельное представление или что-то в этом роде.
4. Вот что это делает, шаблон displayfor — это просто способ сообщить MVC, как отображать модель при вызове (и они могут быть повторно использованы) ответ, который я дал, вы могли бы преобразовать все это в один шаблон опроса displayfor, если хотите.