15

Index.html(表示)

<div class="categories_content_container">
    @Html.Action("_AddCategory", "Categories")
</div>

_AddCategory.cshtml(PartialView)

<script>
    $(document).ready(function () {
        $('input[type=submit]').click(function (e) {
            e.preventDefault();
            $.ajax({
                type: "POST",
                url: '@Url.Action("_AddCategory", "Categories")',
                dataType: "json",
                data: $('form').serialize(),
                success: function (result) {
                    $(".categories_content_container").html(result);
                },
                error: function () {

                }
            });
        });
    });
</script>

@using (Html.BeginForm())
{
    // form elements
}

コントローラ

[HttpPost]
public ActionResult _AddCategory(CategoriesViewModel viewModel)
{
    if(//success)
    {
        // DbOperations...
        return RedirectToAction("Categories");
    }
    else
    {
        // model state is not valid...
        return PartialView(viewModel);
    }
}

質問:操作が成功した場合、別のページ(カテゴリ)にリダイレクトされることを期待しています。ただし、アクションもエラーメッセージもありません。操作が成功しない場合は、期待どおりに機能しています。

これどうやってするの?AJAX投稿を使用して別のページをルーティングするにはどうすればよいですか?

4

2 に答える 2

31

AJAXで呼び出されるコントローラーアクションからリダイレクトしないでください。無駄だ。リダイレクトするURLをJsonResultとして返すことができます。

[HttpPost]
public ActionResult _AddCategory(CategoriesViewModel viewModel)
{
    if(//success)
    {
        // DbOperations...
        return Json(new { redirectTo = Url.Action("Categories") });
    }
    else
    {
        // model state is not valid...
        return PartialView(viewModel);
    }
}

次に、クライアントでこのURLの存在をテストし、それに応じて動作します。

$.ajax({
    type: "POST",
    url: '@Url.Action("_AddCategory", "Categories")',
    data: $('form').serialize(),
    success: function (result) {
        if (result.redirectTo) { 
            // The operation was a success on the server as it returned
            // a JSON objet with an url property pointing to the location
            // you would like to redirect to => now use the window.location.href
            // property to redirect the client to this location
            window.location.href = result.redirectTo;
        } else {
            // The server returned a partial view => let's refresh
            // the corresponding section of our DOM with it
            $(".categories_content_container").html(result);
        }
    },
    error: function () {

    }
});

また、私があなたの呼び出しdataType: 'json'からパラメータを取り除いたことにも注意してください。$.ajax()常にJSONを返すとは限らないため、これは非常に重要です(この場合、JSONを返すことはなかったため、このパラメーターは完全に間違っていました)。私の例では、成功した場合にのみJSONを返しtext/html、失敗した場合に(PartialView)を返します。したがって、jQueryをそのままContent-Typeにして、サーバーから返されたHTTP応答ヘッダーを使用してタイプを自動的に推測し、それに応じて成功コールバックに渡された結果パラメーターを解析する必要があります。

于 2013-02-02T23:10:49.380 に答える
5

行ったajax呼び出しは、ページ全体をリダイレクトできないはずです。非同期呼び出しにのみデータを返します。リダイレクトを実行したい場合は、i

リダイレクトするjavascriptの方法はwindow.locationを使用することです

したがって、ajax呼び出しは次のようになります。

<script>
    $(document).ready(function () {
        $('input[type=submit]').click(function (e) {
            e.preventDefault();
            $.ajax({
                type: "POST",
                url: '@Url.Action("_AddCategory", "Categories")',
                dataType: "json",
                data: $('form').serialize(),
                success: function (result) {
                    window.location='@Url.Action("Categories")';
                },
                error: function () {

                }
            });
        });
    });
</script>

アクションメソッドでは、部分的またはリダイレクトを返す代わりに、Json(true);を返します。

public ActionResult _AddCategory(CategoriesViewModel viewModel)
{
    if(//success)
    {
        return Json(true);
    }
    else
    {
        return Json(false);
    }
}
于 2013-02-02T23:04:24.547 に答える