ASP NET MVC 3 моделирует каскадные классы

#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, если хотите.