1

これで、 HttpGet用とHttpPost用の 2 つのアクションがあり、HttpGetは主に子アクション用であるため、コードは次のようになります。

[ActionName("Comments")]
[HttpGet]
public void CommentList(string postId) {
    // This is for SEO
    if (!ControllerContext.IsChildAction) {
        return Redirect("/post/" + postId);
    }

    // Get list
    return View("CommentList", list);
}

[ActionName("Comments")]
[HttpPost]
public void PostComment(Comment comment) {
    // Save to DB
    // Get the parent post
    // return View("Post", post);
}

残念ながら、私のPostビューでは、 CommentListを子アクションとしてレンダリングします。

@Html.Action("Comments", new { postId = Model.Id });

問題は、POSTリクエストでコメントを送信すると、コメントが DB に保存された後、「コメント」子アクションをレンダリングするPostビューを実行することです。ここで、「コメント」子アクションがレンダリングされるとき、HttpVerb はまだPOSTであるため、ルーターはPostCommentアクションを提供します。これは、(いくつかの検証失敗の後) 「コメント」子アクションをレンダリングするPostビューをレンダリングします...

無限再帰が発生しStackOverflowException、Web サーバーがクラッシュします。

したがって、CommentListアクションを強制的に@Html.Action("Comments")実行する方法はありますか? HttpVerbなどをルーターに渡すことはできますか?

ありがとう

4

1 に答える 1

0

Post Redirect Get like の PRG を使わない理由

[ActionName("Comments")]
[HttpPost]
public void PostComment(Comment comment) {
    // Save to DB
    // redirect to the Get Method
    return RedirectToAction("Comments",new {postId=comment.postId.ToString()});
}
于 2012-12-26T07:49:14.583 に答える