3

それを処理する方法を検索しましたが、これまでのところ何も見つかりませんでした。私の問題があります。投稿モデルとコメントモデルがあります。私の CreateView には投稿を作成するための入力があり、この作成ビューにも表示されます。コードを見てみましょう:

EDIT2: CreateComment アクションの結果を PostController に追加します。& 私の部分的な ListPost ビューの ActionLink

これで、コメントを追加するためのリンクが表示され、CreateComment ビューで送信されますが、DB に保存しようとすると、次のエラーが発生します。

INSERT ステートメントが FOREIGN KEY 制約 \"FK_dbo.Comments_dbo.Posts_PostId\" と競合しました。データベース \Myproject"、テーブル \"dbo.Posts\"、列 'PostId' で競合が発生しました。\r\nステートメントは終了しました。"

ポストコントローラー

        public ActionResult ListPost()
        {
            var post = db.Posts.ToList();
            return PartialView("ListPost", post);
        }


        public ActionResult Create()
        {
            return View(); 
        }


        [HttpPost]
        public ActionResult Create(FormCollection values)
        {
            var post = new Post();
            TryUpdateModel(post);

            if (ModelState.IsValid)
            {
                var context = new UsersContext();
                var username = User.Identity.Name;
                var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
                var userid = user.UserId;                

                post.UserId = userid;
                post.Date = DateTime.Now;

                db.Posts.Add(post);
                db.SaveChanges();
                return RedirectToAction("Create", "Post"); 
            }
            return View(post);
        }


    public ActionResult CreateComment()
    {
        ViewBag.PostId = new SelectList(db.Posts, "PostId", "Content");
        return View("CreateComment");
    }

    [HttpPost]
    public ActionResult CreateComment(FormCollection values)
    {
        var comment = new Comment();
        TryUpdateModel(comment);

        if (ModelState.IsValid)
        {
            var context = new UsersContext();
            var username = User.Identity.Name;
            var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
            var userid = user.UserId;

            comment.UserId = userid;
            comment.Date = DateTime.Now;

            db.Comments.Add(comment);
            db.SaveChanges();
            return RedirectToAction("Create", "Post");
        }
        ViewBag.PostId = new SelectList(db.Posts, "PostId", "Content", comment.PostId);
        return View(comment);
    }

ビューを作成:

@model Myproject.Models.Post

@using (Html.BeginForm("Create", "Post", FormMethod.Post))
{  
        <legend>Add Post</legend>

        <div class="editor-field">
            @Html.EditorFor(model => model.Content)
            @Html.ValidationMessageFor(model => model.Content)
            <input type="file" name="Photo" id="Photo"/>
        </div>   

        <p>
            <input type="submit" value="Post" />
        </p> 
}

@{Html.RenderAction("ListPost", "Post");}

リスト投稿ビュー

    @model IEnumerable<MyProject.Models.Post>

    @foreach (var item in Model.OrderByDescending(x => x.Date))
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Content)
            </td>
        </tr>
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Date)
            <span>@Html.DisplayFor(modelItem => item.Users.UserName)</span>    
            </td>
        </tr>

    <tr>
       <td> @Html.ActionLink("Add Comment", "CreateComment", new {id=item.PostId})</td>      
    </tr>
 }

ここで、投稿にコメントを追加したいと思います。私のコメント モデル (およびテーブル) には、postId プロパティがあります。createCommentView を ListPost ビューに含めるにはどうすればよいですか。 CreatePostView ではなく、このビューに含める必要があると思いますが、どちらもわかりません。どちらの場合も、同じビューでコメントモデルと投稿モデルを使用しているため、方法がわかりません...

何かアイデア、私に送ってくれるリンクなどはありますか? ありがとう、下手な英語でごめんなさい

4

3 に答える 3

2
@Html.ActionLink("Add Comment", "CreateComments", new { id=item.PostId })

PostId をプロパティとしてモデルに渡すようにしてください。

于 2012-12-20T08:58:13.133 に答える
0

createCommentView は ListPost ビューの html の下で使用される部分ビューである必要があり、この部分ビューに投稿 ID を渡します。コメントを新しいアクション CreateComment に渡します

部分的なビューは次のようになります

@model Comment //comment class has post id and comment text

@using (Html.BeginForm("Comment", "CreateComment", FormMethod.Post))
{  
        <legend>Add Post</legend>

        <div class="editor-field">
            @Html.EditorFor(model => model.Comment)
            @Html.EditorFor(model => model.PostId)
        </div>   

        <p>
            <input type="submit" value="Post" />
        </p> 
}

リスト投稿ビューでこれを使用します

@Html.Partial("CommentView", new Comment(){PostId=item.PostId})
于 2014-07-01T18:34:06.330 に答える
0

Niraj の awnser を使用し、下に指定されている 3 つの行を追加すると、正常に動作します

    [HttpPost]
    public ActionResult CreateComment(FormCollection values, int id)
    {
        var comment = new Comment();
        TryUpdateModel(comment);

        /** ADD THIS LINE **/
        Post post = db.Posts.Find(id);

        if (ModelState.IsValid)
        {
            var context = new UsersContext();
            var username = User.Identity.Name;
            var user = context.UserProfiles.SingleOrDefault(u => u.UserName == username);
            var userid = user.UserId;

            comment.UserId = userid;
            comment.Date = DateTime.Now;

            /***  ADD THIS TWO LINES ***/
            comment.Post = post;
            comment.PostId = post.PostId;

            db.Comments.Add(comment);
            db.SaveChanges();
            return RedirectToAction("Create", "Post");
        }            
        ViewBag.PostId = new SelectList(db.Posts, "PostId", "Content", comment.PostId);
        return View(comment);
    }
于 2012-12-22T23:51:47.070 に答える