2

我相信这相对简单,我只是不断地碰到砖墙。我有两个像这样设置的实体类:

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public DateTime CreatedDate { get; set; }
    public string Content { get; set; }
    public string Tags { get; set; }
    public ICollection<Comment> Comments { get; set; }
}

public class Comment
{
    public int Id { get; set; }
    public string DisplayName { get; set; }
    public string Email { get; set; }
    public DateTime DateCreated { get; set; }
    public string Content { get; set; }
    public int PostId { get; set; }
    public Post Post { get; set; }
}

我像这样设置我的 ViewModel:

public class PostCommentViewModel
{
    public Post Post { get; set; }
    public IQueryable<Comment> Comment { get; set; }

    public PostCommentViewModel(int postId)
    {
        var db = new BlogContext();

        Post = db.Posts.First(x => x.Id == postId);
        Comment = db.Comments;
    }
}

我让我的控制器这样做:

public ActionResult Details(int id = 0)
    {
        var viewModel = new PostCommentViewModel(id);
        return View(viewModel);
    }

然后视图如下所示:

@model CodeFirstBlog.ViewModels.PostCommentViewModel


<fieldset>
<legend>PostCommentViewModel</legend>
@Html.DisplayFor(x => x.Post.Title)
<br />
@Html.DisplayFor(x => x.Post.Content)
<br />
@Html.DisplayFor(x => x.Post.CreatedDate)
<hr />    
@Html.DisplayFor(x => x.Comment)
</fieldset>

结果是显示数据,但不是我想要的评论。

在此处输入图像描述

您会看到评论(其中有两个)并且仅在每个“12”上显示 id 属性

我怎样才能让它进入并显示特定于该特定帖子的评论详细信息?我想一个 foreach 循环是有序的,但我不知道如何正确钻入 Model.Comment 属性。

我试过这个:

@foreach(var item in Model.Comment)
{
@Html.DisplayFor(item.DisplayName)
@Html.DisplayFor(item.Content)
@Html.DisplayFor(item.DateCreated)
}

但我得到的错误是“方法'System.Web.Mvc.Html.DisplayExtensions.DisplayFor(System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression>)'的类型参数不能从用法中推断出来。尝试明确指定类型参数。”

不知道我应该在这里做什么..

4

3 回答 3

3

循环评论模型:

@model CodeFirstBlog.ViewModels.PostCommentViewModel


<fieldset>
<legend>PostCommentViewModel</legend>
@Html.DisplayFor(x => x.Post.Title)
<br />
@Html.DisplayFor(x => x.Post.Content)
<br />
@Html.DisplayFor(x => x.Post.CreatedDate)
<hr />    
@foreach(var comment in Model.Comment) {
    @Html.DisplayFor(x => comment)
}
</fieldset>
于 2012-06-21T15:20:58.003 回答
0

为您的类创建一个DisplayTemplateComment并且它应该可以工作,无需遍历视图引擎为您执行的集合。

Comment根据我的评论,这就是为您的班级创建显示模板所需要做的一切:

在您的视图文件夹中创建一个DisplayTemplates子文件夹,并在其中创建一个名为Comment.cshtml. 您的模板可能如下所示:

@model CodeFirstBlog.ViewModels.Comment

<div class="comment">
    @Html.DisplayFor(m => m.DisplayName)
    ....
</div>

就是这样!如果您需要更多地控制评论的显示方式,那么您可以简单地调整模板以适应。

于 2012-06-21T15:31:24.560 回答
0
public class PostCommentViewModel 
{ 
    public Post Post { get; set; } 
    public IQueryable<Comment> Comment { get; set; } 

    public PostCommentViewModel(int postId) 
    { 
        var db = new BlogContext(); 

        Post = db.Posts.First(x => x.Id == postId); 
        Comment = Post.Comments; 
    } 
} 

您是否为 Comment 类创建了 Html 辅助方法?

于 2012-06-21T15:33:02.880 回答