Ich habe versucht, eine kleine Demo einzurichten, in der ein Artikel mehrere Kommentare hat. Die Artikeldetailansicht sollte die Kommentare in einer Teilansicht darstellen. Die Teilansicht selbst enthält eine weitere Teilansicht zum Hinzufügen eines neuen Kommentars.Warum ruft das PartialView sich selbst auf?
Wenn ich versuche, einen weiteren Kommentar hinzuzufügen, erhalte ich eine InsufficientExecutionStackException
, weil die Aktion in der Steuerung sich selbst anruft. Warum passiert das?
(Wenn jemand hat das Kursmaterial zur Hand Ein ähnliches Beispiel bei Modul 9 in dem 70-486 Kurs von Msft sein sollte, das ist, was ich zu bauen versucht..)
Edit: Der vollständige Code ist auf github
Edit2: Die Probe auf Github wurde behoben. Wie Stephen Mücke hervorhob, verursachte die Tatsache, dass sowohl die GET
als auch die POST
Methode die gleichen Namen hatten, den Zirkelverweis. Bevor irgendjemand mehr darauf hinweist, dass DI- und View-Modelle fehlen und dass das Rendern aller Kommentare suboptimal ist: Ja, mir ist klar, und nein, diese Dinge waren nichts, was ich erreichen wollte. Das war nur eine kurze n schmutzige Demo.
Controller:
[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);
}
entsprechende Zeile in der Details.cshtml für Artikel:
@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>
}
Als beiseite zu passen, wenn das Trainingsmaterial wird Ihnen anweist, Verwenden Sie eine Entity Model-Klasse als ViewModel oder DTO, dann sollte ich Ihnen sagen, dass es eine schlechte Übung ist - verwenden Sie immer einen dedizierten ViewModel/DTO-Typ, anstatt Entity Model-Typen erneut zu verwenden. – Dai
Ich replizierte nur Ihre Ansichten in einem neuen leeren Projekt mit einer einfachen 'CommentsController :: Details' Aktion und ich kann dieses Problem nicht reproduzieren. Kannst du dein gesamtes Projekt irgendwo in einem Zip/Archiv posten? – Dai
Warum gibt die POST-Methode alle Kommentare zurück, wenn Sie sie bereits in der Ansicht haben (im Gegensatz zum Hinzufügen des neuen Kommentars zur Ansicht) –