在我的MVC视图中获取ViewModel数据

时间:2012-06-21 15:17:44

标签: c# asp.net-mvc viewmodel

我相信这是相对简单的,我只是碰壁砖墙。我有两个实体类设置如下:

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>

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

enter image description here

你看到评论(有两个),只是在每个“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&gt;)'无法从用法。尝试明确指定类型参数。“

不确定我应该在这做什么..

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

为您的Comment类创建一个DisplayTemplate,它应该可以正常工作,无需迭代视图引擎为您完成的集合。

根据我的评论,您只需为Comment课程创建展示广告模板即可:

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

@model CodeFirstBlog.ViewModels.Comment

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

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

答案 2 :(得分: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 class制作了Html帮助方法?