記事に複数のコメントがある小さなデモを設定しようとしました。記事の詳細ビューは、コメントを部分的に表示する必要があります。 partialView自体には、新しいコメントを追加するための別の部分的なビューが含まれています。PartialViewはなぜ自分自身を呼び出し続けますか?
別のコメントを追加しようとすると、コントローラのアクションが自分自身を呼び出し続けているため、InsufficientExecutionStackException
が届きます。なぜこれが起こるのですか?
(。誰かが手元に教材を持っている場合は同様の例は、MSFT 70から486のコースにモジュール9である必要があり、それは私が構築しようとするものです。)
編集:完全なコードがオンになっていますgithub
Edit2: Githubのサンプルが修正されました。 Stephen Mueckeが指摘したように、GET
とPOST
の両方のメソッド名が同じ名前のハットが循環参照を引き起こしていたという事実が指摘されています。 これ以上の人々が指摘する前に、DIモデルとビューモデルは欠落しており、すべてのコメントを再レンダリングすることは最適ではありません:はい私は気付いています。これはちょうどクイックn汚いデモだった。
コントローラー:
[ChildActionOnly]
public PartialViewResult _GetCommentsForArticle(int articleId)
{
ViewBag.ArticleId = articleId;
var comments = db.Comments.Where(x => x.Article.ArticleId == articleId).ToList();
return PartialView("_GetCommentsForArticle", comments);
}
public PartialViewResult _CreateCommentForArticle(int articleId)
{
ViewBag.ArticleId = articleId;
return PartialView("_CreateCommentForArticle");
}
[HttpPost]
public PartialViewResult _CreateCommentForArticle(Comment comment, int articleId)
{
ViewBag.ArticleId = articleId;
comment.Created = DateTime.Now;
if (ModelState.IsValid)
{
db.Comments.Add(comment);
db.SaveChanges();
}
var comments = db.Comments.Where(x => x.Article.ArticleId == articleId).ToList();
return PartialView("_GetCommentsForArticle", comments);
}
条についてDetails.cshtmlで該当する行:
@Html.Action("_GetCommentsForArticle", "Comments", new { articleId = Model.ArticleId})
_GetCommentsForArticle:
@model IEnumerable<Mod9_Ajax.Models.Comment>
<div id="all-comments">
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Text)
</th>
</tr>
@foreach (var item in Model)
{
@* ... *@
}
</table>
</div>
@Html.Action("_CreateCommentForArticle", "Comments", new { articleId = ViewBag.ArticleId })
_CreateCommentForArticle:
@model Mod9_Ajax.Models.Comment
@using (Ajax.BeginForm("_CreateCommentForArticle", "Comments", new AjaxOptions
{
HttpMethod = "POST",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "all-comments"
}))
{
@* ... *@
<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>
}
に合うようにフォームを変更することができますEntity ModelクラスをViewModelまたはDTOとして使用することは悪いことです。エンティティモデルタイプを再利用するのではなく、常に専用のViewModel/DTOタイプを使用してください。 – Dai
単純な 'CommentsController :: Details'アクションであなたのビューを新しい空のプロジェクトに複製しましたが、私はこの問題を再現できません。プロジェクト全体をどこかのZip/archiveに投稿できますか? – Dai
POSTメソッドは、(ビューに新しいコメントを追加するのではなく)すべてのコメントをビューに戻したときにそれを返すのはなぜですか? –