2016-10-26 4 views
1

私はIMDBスタイルのクローンを作成するところにMVC5プロジェクトを持っています。それは映画の代わりにゲーム、映画、本のためです。現在のレビューIDを取得してそのレビューにコメントを投稿しますか?

このページにはレビューフィードがあります。ここにはすべてのレビューの一覧が表示され、新しいレビューを追加することもできます。

私がレビューをクリックすると、そのレビューの詳細ページ(〜Views/Reviews/Details.cshtml)にアクセスできます。それはすべての細部を示し、問題はない。

レビュー/詳細ビューでは、コメントセクションを追加します。だから私は、私のレビュー/ Details.cshtmlページにこれを追加しました:

<h4>Comments</h4> 

@{ 
    Html.RenderPartial("_CommentPartial"); 
} 

@foreach (var comment in Model.CommentToReviews) 
{ 
    <div class="row"> 
     <div class="col-xs-2"> 
      @Html.Raw(comment.User.Username) 
      <br /> 
      posted at: @Html.Raw(comment.CreatedDate.ToShortDateString()) 
     </div> 
     <div class="col-xs-10"> 
      @Html.Raw(comment.Comment) 
     </div> 
    </div> 
} 

問題は、私が作成し、コメントを部分図に現在のレビュー-IDに合格するかどうかはわかりませんということです。

これは部分的である:

@model gmbdb.CommentToReview 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <h4>Add a comment</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.Comment, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Comment, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Comment, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

そしてこれは、CommentToReviewsControllerで取得/ POSTメソッドを作成します

GETです:

public ActionResult Create(Guid reviewId) 
{ 
     var newComment = new CommentToReview(); 
     newComment.UserId = ((User) Session["currentUser"]).Id; 
     newComment.ReviewId = reviewId; 
     return View(newComment); 
} 

ポスト:

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Include = "Id,UserId,ReviewId,Comment,CreatedDate")] CommentToReview commentToReview) 
     { 
      if (ModelState.IsValid) 
      { 
       commentToReview.Id = Guid.NewGuid(); 
       commentToReview.CreatedDate = DateTime.Now; 

       //find current Review and add this comment to that review 
       foreach (var review in db.Reviews) 
       { 
        if (review.Id == commentToReview.ReviewId) 
        { 
         review.CommentToReviews.Add(commentToReview); 

         db.SaveChanges(); 
        } 
       } 

       return RedirectToAction("Index"); 
      } 

      ViewBag.ReviewId = new SelectList(db.Reviews, "Id", "Title", commentToReview.ReviewId); 
      ViewBag.UserId = new SelectList(db.Users, "Id", "Username", commentToReview.UserId); 
      return View(commentToReview); 
     } 

答えて

0

変化するあなたの詳細ではなく、部分的にアクションを呼び出すために見るので、あなたは、現在の審査のIDを受信することができ、次のようにアクションを作成

ビュー/クチコミ/ Details.cshtml

<h4>Comments</h4> 
@{ 
    Html.RenderAction("Create", new { reviewId = Model.Id }); 
} 

public ActionResult Create(Guid reviewId) 
{ 
    var newComment = new CommentToReview 
    { 
     UserId = UserId, 
     ReviewId = reviewId 
    }; 

    return PartialView("_CommentPartial", newComment); //return the partial from the action 
} 

ここで、作成アクションはレビューのIDを受け取り、それをモデルに関連付けて、_CommentPartial部分ビューを返すことができます。

あなたのポストアクションでは唯一のことはリダイレクトを行うことができないからです。これは子アクションであるため、JsonResultをビューに戻してajax経由で呼び出し、あなたのページをリフレッシュしてください。

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "Id,UserId,ReviewId,Comment,CreatedDate")] CommentToReview commentToReview) 
{ 
    if (ModelState.IsValid) 
    { 
     //the code to add the comment 

     return Json(new 
     { 
      success = true, 
      //other data for the comment, maybe the rendered comment as html to display it on the view. 
     }); 
    } 

    ViewBag.ReviewId = new SelectList(db.Reviews, "Id", "Title", commentToReview.ReviewId); 
    ViewBag.UserId = new SelectList(db.Users, "Id", "Username", commentToReview.UserId); 
    return View(commentToReview); 
} 

これが役に立ちます。

+0

ありがとうございます! @ Html.RenderActionは私が探していたものです。私はそれを正しいコントローラを指すように変更しました( "Create"、 "CommentToReviews"など)。そのコントローラーでは、私はすでに正しいレビューコメントに追加するためのアクションを持っています。 (あなたは私のOPで見ることができるもの)しかし、今、私は厄介なエラーを取得する! "セッションで実行中の他のスレッドがあるため、新しいトランザクションが許可されません。" このメッセージの後に "db.SaveChanges()"という行が強調表示されます。何か案が? –

+0

[このスレッドを見る](http://stackoverflow.com/questions/2113498/sqlexception-from-entity-framework-new-transaction-is-not-allowed-because-ther):この問題はいくつかの原因が考えられますが、私はあなたの行動をあなたの行動と呼ぶ方法とは関係がないと考えています –

+1

Gotcha!私はそれを考え出した。これを読んで同じ問題を抱えている人のための短い答え:Do not db。foreachループ内のSaveChanges()後にしてください!再度、感謝します :) –

関連する問題