2012-04-13 2 views
2

Ich habe ein Ansichtsmodell für einen Blog einrichten momentan zu arbeiten:Kann nicht ein Dropdownlist bekommen mit Ansichtsmodell

public class PostViewModel 
{ 
    public string Title { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string Content { get; set; } 
    public int CommentCount { get; set; } 
    public ICollection<Topic> Topics { get; set; } 
    public ICollection<Comment> Comments { get; set; } 
} 

, die perfekt mit dem Controller funktioniert:

private MyDB db = new MyDB(); 

public ActionResult Index() 
{ 
    var posts = (from p in db.Set<BlogPost>() 
       select new PostViewModel 
       { 
        Title = p.Title, 
        DateCreated = p.DateCreated, 
        Content = p.Content, 
        Topics = p.Topics, 
        Comments = p.Comments, 
        CommentCount = p.Comments.Count 
       }).ToList(); 

    return View(posts); 
} 

diese beiden Teile gegeben, Ich kann durch die Liste foreach und einen Blog-Post mit entsprechenden Kommentaren und Themen erstellen. Allerdings hätte ich gerne eine Dropdown-Liste auf der Seite, die eine Liste von Themen enthält. Ich vermute, ich muss auch mein ViewModel und HomeController ändern, aber ich bin mir nicht sicher, wie ich das machen soll.

@Html.DropDownListFor(???????) 

dann in mein Index.cshtml gehen würde, aber ich weiß nicht, wie ich damit umgehen würde, wenn alles andere als eine Liste kommen in ist?

+0

Müssen Sie die Themen nur in der Dropdown-Liste anzeigen oder benötigen Sie sie auch an anderer Stelle in der Ansicht? –

Antwort

2

Sie können Ihr Ansichtsmodell so anpassen, dass es alle erforderlichen Informationen enthält, die für die Ansicht erforderlich sind. Sie haben also etwas über eine Liste von Beiträgen und ein Dropdown-Menü mit Themen erwähnt. So ist es ziemlich einfach:

public class BlogViewModel 
{ 
    public PostViewModel Post { get; set; } 

    public string TopicID { get; set; } 
    public IEnumerable<SelectListItem> Topics { get; set; } 
} 

und dann natürlich müssen Sie Ihre Controller-Aktion anzupassen, so dass es von Ihrem Backend-Schichten alle benötigten Informationen abruft und schaffen die richtige Ansicht Modell zur Ansicht übergeben werden:

public ActionResult Index() 
{ 
    var posts = (from p in db.Set<BlogPost>() 
       select new PostViewModel 
       { 
        Title = p.Title, 
        DateCreated = p.DateCreated, 
        Content = p.Content, 
        Topics = p.Topics, 
        Comments = p.Comments, 
        CommentCount = p.Comments.Count 
       }).ToList(); 

    IEnumerable<Topic> topics = ... go ahead and fetch the topics you want to show in the ddl 

    var blog = new BlogViewModel 
    { 
     Posts = posts, 
     Topics = topics.Select(t => new SelectListItem 
     { 
      Value = t.ID, 
      Text = t.TopicText 
     }) 
    }; 
    return View(blog); 
} 

und schließlich die Ansicht:

@model BlogViewModel 
... 
@Html.DropDownListFor(x => x.TopicID, Model.Topics) 

und wenn Sie eine Schleife oder etwas über den Pfosten einfach verwenden Model.Posts im wetteifern wollte w wo Sie zuvor Model direkt verwendet haben, weil Ihre Ansicht stark auf IEnumerable<PostViewModel> getippt wurde.

+0

Verzeih mir, weil ich neu bin ... wenn du sagst "geh voran und hole die Themen, die du zeigen willst ..." was soll ich dort tun? Eine LINQ-Abfrage vermute ich, aber ich habe viel zu lernen ... –

+0

@ pjb5064, ich habe absolut keine Ahnung, wo Sie Ihre Themen speichern, wie sie gespeichert sind, wie Sie sie abrufen und so weiter. So kann dir wirklich nicht weiterhelfen. Auch das hat mit ASP.NET MVC wirklich nichts zu tun. Wenn Sie Probleme haben, eine Datenbank einzurichten und diese Datenbank mit einem bestimmten ORM wie EF abzufragen, starten Sie bitte eine neue Frage, in der Ihr Datenbankschema und Ihre Domänenentitäten erklärt werden und was genau Sie abzurufen versuchen. –

+0

Ich bekomme jedoch einen Fehler auf "Value = t.id" sagen, dass ich nicht int in String konvertieren kann ... t.id ist eine Zeichenfolge im BlogViewModel aber ... wenn ich.ToString konvertieren (T.ID) Dieser Fehler verschwindet und themes.Select wird mit "System.Collections.Generic.IEnumerable " kann nicht implizit in "System.Collections.Generic.IEnumerable '. Eine explizite Konvertierung existiert (fehlt Ihnen ein Cast?) –

Verwandte Themen