私は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);
}
ありがとうございます! @ Html.RenderActionは私が探していたものです。私はそれを正しいコントローラを指すように変更しました( "Create"、 "CommentToReviews"など)。そのコントローラーでは、私はすでに正しいレビューコメントに追加するためのアクションを持っています。 (あなたは私のOPで見ることができるもの)しかし、今、私は厄介なエラーを取得する! "セッションで実行中の他のスレッドがあるため、新しいトランザクションが許可されません。" このメッセージの後に "db.SaveChanges()"という行が強調表示されます。何か案が? –
[このスレッドを見る](http://stackoverflow.com/questions/2113498/sqlexception-from-entity-framework-new-transaction-is-not-allowed-because-ther):この問題はいくつかの原因が考えられますが、私はあなたの行動をあなたの行動と呼ぶ方法とは関係がないと考えています –
Gotcha!私はそれを考え出した。これを読んで同じ問題を抱えている人のための短い答え:Do not db。foreachループ内のSaveChanges()後にしてください!再度、感謝します :) –