Подтвердить что ты не робот

ASP.NET MVC Частичный просмотр сообщения ajax?

Index.html(View)

<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?

4b9b3361

Ответ 1

Не переадресовывайте действия контроллера, вызываемые с помощью 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 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, возвращенный сервером, чтобы автоматически выводить тип и анализировать параметр результата, переданный соответственно вашему обратному результату.

Ответ 2

Вызов 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);
    }
}