2

これは比較的単純なことだと思います。レンガの壁にぶつかり続けているだけです。次のように設定された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>

結果はデー​​タを表示していますが、コメントに必要なものではありません。

ここに画像の説明を入力

コメント (2 つあります) が表示され、それぞれの id プロパティが「12」になっていることがわかります。

この特定の投稿に固有のコメントの詳細に入って表示するにはどうすればよいですか? 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
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 に答える
0

クラスのDisplayTemplateを作成するCommentと、それが機能するはずです。ビュー エンジンが行うコレクションを反復処理する必要はありません。

Comment私のコメントによると、クラスの表示テンプレートを作成するために必要なのはこれだけです。

DisplayTemplatesビュー フォルダー内にサブフォルダーを作成し、その中に という名前の新しい部分ビューを作成しますComment.cshtml。テンプレートは次のようになります。

@model CodeFirstBlog.ViewModels.Comment

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

以上です!コメントの表示方法をより細かく制御する必要がある場合は、テンプレートを簡単に調整して調整できます。

于 2012-06-21T15:31:24.560 に答える