为什么PartialView会自行调用?

时间:2016-11-23 18:39:10

标签: c# asp.net asp.net-mvc

我试图设置一个小型演示,其中一篇文章有​​多个评论。文章详细信息视图应该在局部视图中呈现注释。 partialView本身包含另一个用于添加新注释的局部视图。

当我尝试添加另一条评论时,我收到InsufficientExecutionStackException,因为控制器中的操作一直在调用。为什么会这样?

(如果有人掌握了课程资料。类似的例子应该是来自Msft的70-486课程的模块9;这就是我想要建立的。)

修改:完整代码位于github

Edit2: Github上的示例已修复。正如Stephen Muecke指出的那样,事实上,GETPOST方法都有相同的名称,导致循环引用。 在更多人指出之前,缺少DI和View模型,并且重新呈现所有注释都是次优的:是的我知道,不,那些事情都没有,我想完成。这只是一个快速的脏演示。

控制器:

[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>
}

1 个答案:

答案 0 :(得分:1)

为了解释发生了什么,你有一个表格贴在你身上_CreateCommentForArticle()方法,然后呈现你的_GetCommentsForArticle.cshtml部分,其中包含@Html.Action("_CreateCommentForArticle", ...)

Details()的初始GET方法中,视图将正确呈现,但是当您提交表单时,_GetCommentsForArticle页面的当前请求是[HttpPost]方法,因此{ {1}}会查找@Html.Action()方法(而不是[HttpPost]方法)。 [HttpGet]反过来呈现[HttpPost]部分并再次调用_GetCommentsForArticle.cshtml POST方法,该方法呈现_CreateCommentForArticle()部分等等,直到内存不足并抛出异常为止

您可以通过更改POST方法的名称来解决此问题,例如

_GetCommentsForArticle.cshtml

并修改表格以适合

[HttpPost]
public PartialViewResult Create(Comment comment, int articleId)