Как получить ответ ASP.NET MVC Ajax для перенаправления на новую страницу вместо вставки представления в UpdateTargetId? - PullRequest
83 голосов
/ 08 октября 2009

Я использую Ajax.BeginForm для создания формы, которая выполнит обратную передачу ajax для определенного действия контроллера, а затем, если действие выполнено успешно, пользователь должен быть перенаправлен на другую страницу (в случае сбоя действия появляется сообщение о состоянии). отображается с помощью AjaxOptions UpdateTargetId).

using (Ajax.BeginForm("Delete", null,
        new { userId = Model.UserId },
        new AjaxOptions { UpdateTargetId = "UserForm", LoadingElementId = "DeletingDiv" },
        new { name = "DeleteForm", id = "DeleteForm" }))
   {
    [HTML DELETE BUTTON]
   }

Если удаление прошло успешно, я возвращаю результат перенаправления:

[Authorize]
public ActionResult Delete(Int32 UserId)
{
    UserRepository.DeleteUser(UserId);
    return Redirect(Url.Action("Index", "Home"));
}

Но представление Home Controller Index загружается в UpdateTargetId, и поэтому я получаю страницу внутри страницы. Две вещи, о которых я думаю:

  1. Либо я это архитектор неправильно и должен обрабатывать этот тип действовать по-другому (не используя ajax).
  2. Вместо возврата перенаправления результат, вернуть представление, которое имеет JavaScript в нем, который делает перенаправление на стороне клиента.

У кого-нибудь есть комментарии к № 1? Или, если # 2 является хорошим решением, как будет выглядеть «представление перенаправления javascript»?

Ответы [ 14 ]

0 голосов
/ 20 мая 2016

Как сказал Бен Фостер, вы можете вернуть Javascripts, и он перенаправит вас на нужную страницу.

Чтобы загрузить страницу на текущей странице:

return JavaScript("window.location = 'http://www.google.co.uk'");'

Чтобы загрузить страницу в новой вкладке:

return JavaScript("window.open('http://www.google.co.uk')");
0 голосов
/ 24 августа 2015

Добавить вспомогательный класс:

public static class Redirector {
        public static void RedirectTo(this Controller ct, string action) {
            UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);

            ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action));
        }

        public static void RedirectTo(this Controller ct, string action, string controller) {
            UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);

            ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action, controller));
        }

        public static void RedirectTo(this Controller ct, string action, string controller, object routeValues) {
            UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);

            ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action, controller, routeValues));
        }
    }

Затем вызовите свои действия:

this.RedirectTo ("Индекс", "Цемент");

Добавление кода javascript в любой глобальный файл или файл макета, включенный в javascript, для перехвата всех запросов ajax:

<script type="text/javascript">
  $(function() {
    $(document).ajaxComplete(function (event, xhr, settings) {
            var urlHeader = xhr.getResponseHeader('AjaxRedirectURL');

            if (urlHeader != null && urlHeader !== undefined) {
                window.location = xhr.getResponseHeader('AjaxRedirectURL');
            }
        });
  });
</script>
0 голосов
/ 22 декабря 2013

Если вы перенаправлены из класса JavaScript

тот же вид - другой контроллер

<strike>window.location.href = `'Home'`;</strike>

не тот же вид

<strike>window.location.href = `'Index/Home'`;</strike>
0 голосов
/ 29 апреля 2012

Я не удовлетворен лучшим ответом Джозефа, вместо того, чтобы исправить правильную проблему, он сказал, что это неправильный вариант использования. На самом деле есть много мест, например, если вы конвертируете старую кодовую базу в код с расширением ajaxified, и там вам НУЖНО это, тогда вам НУЖНО. В программировании нет оправдания, потому что не только вы кодируете своих плохих и хороших разработчиков, и вам приходится работать бок о бок. Поэтому, если я не кодирую перенаправление в ajax, мой коллега-разработчик может заставить меня найти решение для него. Точно так же, как мне нравится использовать все сайты с паттернами AMD или mvc4, и моя компания может держать меня подальше от этого в течение года.

Итак, давайте поговорим сейчас о решении.

Я отлично справился с обработкой запросов и ответов ajax, и самый простой способ, который я обнаружил, - это отправить коды состояния клиенту и иметь одну стандартную функцию javascript для понимания этих кодов. Если я просто отправлю, например, код 13, это может означать перенаправление.

Итак, ответ json, такой как {statusCode: 13, messsage: '/ home / logged-in'} конечно, есть множество вариантов, предложенных как {status: 'success', код: 13, url: '/ home / logged-in', сообщение: 'Вы вошли в систему сейчас'}

и т. Д., Так что по вашему выбору стандартных сообщений

Обычно я наследую от базового класса Controller и ставлю свой выбор стандартных ответов следующим образом

public JsonResult JsonDataResult(object data, string optionalMessage = "")
    {
        return Json(new { data = data, status = "success", message = optionalMessage }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonSuccessResult(string message)
    {
        return Json(new { data = "", status = "success", message = message }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonErrorResult(string message)
    {
        return Json(new { data = "", status = "error", message = message }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonRawResult(object data)
    {
        return Json(data, JsonRequestBehavior.AllowGet);
    }

Об использовании $ .ajax intead Ajax.BeginForm Я хотел бы использовать Jquery Ajax и я, но опять же это не я во всем мире, чтобы принимать решения У меня есть приложение, полное Ajax.BeginForm, и, конечно, я этого не делал. Но я должен жить с этим.

Таким образом, есть обратный вызов успеха в начальной форме, вам не нужно использовать jquery ajax для использования обратных вызовов Что-то об этом здесь Ajax.BeginForm, вызывает действие, возвращает JSON, как получить доступ к объекту JSON в моей функции JS OnSuccess?

Спасибо

...