1

asp.netを使用して簡単なブログアプリケーションを作成しようとしています。私は初心者で、c#とasp.netmvcを自分で学ぼうとしています。

私が直面している問題は、投稿にコメントを追加しようとすると機能しないことです。投稿にコメントが添付されていますが、何も表示されません。また、データベースを確認すると、BlogIDフィールド以外のNullフィールドが含まれているだけです。私は何が間違っているのですか?

私のコードは以下の通りです:

ブログ-クラス

public class Blog
{
    public int BlogID { get; set; }
    public string Title { get; set; }
    public string Writer { get; set; }

    [DataType(DataType.MultilineText)]
    public string Excerpt { get; set; }

    [DataType(DataType.MultilineText)]
    public string Content { get; set; }

    [DataType(DataType.Date)]
    public DateTime PublishDate { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }
}

コメント-クラス

public class Comment
    {
        public int CommentID { get; set; }
        public string Name { get; set; }

        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        [DataType(DataType.MultilineText)]
        public string CommentBody { get; set; }

        public virtual int BlogID { get; set; } 
        public virtual Blog Blog { get; set; }
    }

BlogDetailViewModel

public class BlogDetailsViewModel
{
    public Blog Blog { get; set; }
    public Comment Comment { get; set; }
}

ブログ-詳細コントローラー

public ViewResult Details(int id)
{

    Blog blog = db.Blogs.Find(id);
    BlogDetailsViewModel viewModel = new BlogDetailsViewModel {Blog = blog};
    return View(viewModel);
}

ブログの詳細-表示

@model NPLHBlog.ViewModels.BlogDetailsViewModel

以下のブログ詳細ページの最後にブログ投稿とコメントフォームを表示するコードがあります。

   @using (Html.BeginForm("Create", "Comment"))
    {
        <input type="hidden" name="BlogID" value="@Model.Blog.BlogID" />
        <div class="editor-label">
            @Html.LabelFor(model => model.Comment.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Comment.Name)
            @Html.ValidationMessageFor(model => model.Comment.Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Comment.Email)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Comment.Email)
            @Html.ValidationMessageFor(model => model.Comment.Email)
        </div>            

        <div class="editor-label">
            @Html.LabelFor(model => model.Comment.CommentBody)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Comment.CommentBody)
            @Html.ValidationMessageFor(model => model.Comment.CommentBody)
        </div>
        <p>
            <input type="submit" value="Add Comment" />
        </p>

コメント-コントローラーを作成

public class CommentController : Controller
{
    private NPLHBlogDb db = new NPLHBlogDb();

    //
    // GET: /Comment/

    public ActionResult Create(Comment c)
    {
        Blog blog = db.Blogs.Single(b => b.BlogID == c.BlogID);
        blog.Comments.Add(c);
        db.SaveChanges();
        return RedirectToAction("Details", "Blog", new { ID = c.BlogID });
    }

どんな助けでもありがたいです。

4

3 に答える 3

1

答えが見つかりました...コメントコントローラーの作成アクションを次のように更新しました。

public ActionResult Create(BlogDetailsViewModel viewModel)
{
    Blog blog = db.Blogs.Single(b => b.BlogID == viewModel.Comment.BlogID);
    Comment c = viewModel.Comment;
    blog.Comments.Add(c);
    db.SaveChanges();
    return RedirectToAction("Details", "Blog", new { ID = c.BlogID });
}
于 2012-06-29T10:41:49.860 に答える
0

アクション引数として渡されるCommentインスタンスのBlogプロパティはnullであるため、保存する前にコメントをブログに関連付けてみてください。

public ActionResult Create(Comment c)
{
    Blog blog = db.Blogs.Single(b => b.BlogID == c.BlogID);
    blog.Comments.Add(c);

    // associate the comment with the blog that you have retrieved
    c.Blog = blog;

    db.SaveChanges();
    return RedirectToAction("Details", "Blog", new { ID = c.BlogID });
}
于 2012-06-29T10:18:08.723 に答える
0

CreateActionResultメソッドにHttpPost属性を追加する必要があると思います。

[HttpPost]
public ActionResult Create(Comment c)
    {
        Blog blog = db.Blogs.Single(b => b.BlogID == c.BlogID);
        blog.Comments.Add(c);
        db.SaveChanges();
        return RedirectToAction("Details", "Blog", new { ID = c.BlogID });
    }
于 2012-06-29T10:44:20.387 に答える