2

我目前为博客设置了 ViewModel:

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; }
}

与控制器完美配合:

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);
}

鉴于这两个部分,我可以遍历列表并生成带有相应评论和主题的博客文章。但是,我希望在其中包含主题列表的一侧有一个下拉列表。我猜我也需要改变我的 ViewModel 和 HomeController,但我只是不确定如何去做。

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

然后会进入我的Index.cshtml,但我不知道当其他所有内容都以列表形式出现时我会如何处理?

4

1 回答 1

2

您可以调整您的视图模型,使其包含视图所需的所有必要信息。所以你提到了一些关于帖子列表和主题下拉列表的内容。所以这很简单:

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

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

然后当然你必须调整你的控制器动作,以便它从你的后端层获取所有需要的信息并创建正确的视图模型以传递给视图:

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);
}

最后是视图:

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

当您想在帖子上循环或其他内容时,只需Model.Posts在您之前Model直接使用的视图中使用,因为您的视图被强类型化为IEnumerable<PostViewModel>.

于 2012-04-13T16:21:37.093 回答