0

私のMVCWebサイトでは、小さなフォーラムを作成しています。単一の投稿の場合、以下のように「PostController」で「Single(Postpost)」アクションをレンダリングしています。

<% Html.RenderAction<PostController>(p => p.Single(comment)); %>

また、ユーザーが投稿に返信すると、「CreatePost」アクションにajaxリクエストとして返信し、次のようなこのアクションの結果として「シングル」ビューを返します。

public ActionResult CreatePostForForum(Post post)
{
    //Saving post to DB
    return View("Single", postViewData);
}

ビューのみがレンダリングされるのが好きな場合、「単一」アクション本体のコードは実行されません。

これを行うための最良の方法は何ですか?

また、以下のように「シングル」アクションの結果をJsonObjectの文字列として返したい

return Json(new{IsSuccess = true; Content= /*HERE I NEED Single actions result*/});
4

2 に答える 2

0

このようなものを使用できますが、これには十分注意してください。実際には、追跡可能なエラーが発生する可能性があります(たとえば、Singleメソッドでビュー名を明示的に設定するのを忘れた場合)。

public ActionResult Single(PostModel model) {
    // it is important to explicitly define which view we should use
    return View("Single", model);
}

public ActionResult Create(PostModel model) {

    // .. save to database ..

    return Single(model);
}

よりクリーンな解決策は、標準形式から投稿された場​​合と同じように実行することです-リダイレクト(XMLHttpRequestがそれに続きます)

jsonでラップされたajaxビューを返すために、次のクラスを使用します

public class AjaxViewResult : ViewResult
{
    public AjaxViewResult()
    {

    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (!context.HttpContext.Request.IsAjaxRequest())
        {
            base.ExecuteResult(context);
            return;
        }

        var response = context.HttpContext.Response;

        response.ContentType = "application/json";

        using (var writer = new StringWriter())
        {
            var oldWriter = response.Output;
            response.Output = writer;
            try
            {
                base.ExecuteResult(context);
            }
            finally
            {
                response.Output = oldWriter;
            }

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            response.Write(serializer.Serialize(new
            {
                action = "replace",
                html = writer.ToString()
            }));
        }
    }
}

これはおそらく最善の解決策ではありませんが、非常にうまく機能します。View、ViewData.Model、ViewData、MasterName、TempDataの各プロパティを手動で設定する必要があることに注意してください。

于 2011-03-14T23:19:19.860 に答える
0

私の推薦:

  • Ajaxを介してフォーラムの返信(および任意のオプション)を投稿します。
  • 次のメソッドを使用して、JSONResultを返します。ASPMVCコンテンツをJSONとして表示してコンテンツをレンダリングします。
  • ajax呼び出しのOnSuccessハンドラーで、IsSuccessがtrueかどうかを確認します。成功した場合は、JQueryを使用してコンテンツを適切なコンテナに追加します
于 2011-03-14T23:35:02.460 に答える