我目前为博客设置了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,但是当其他所有内容都以列表形式出现时我不知道如何处理它?</ p>
答案 0 :(得分: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>
。