ASP.NET MVC3: Как перенаправить на представление, когда публикация была сделана с использованием AJAX?

#ajax #json #asp.net-mvc-3 #redirect #view

#ajax #json #asp.net-mvc-3 #перенаправление #Вид

Вопрос:

У меня есть представление поиска, которое использует AJAX для отправки запроса на сервер. В зависимости от объекта ответа, возвращаемого репозиторием, должно быть показано диалоговое окно (заполненное данными с использованием объекта Json) в режиме поиска (представление, из которого был отправлен запрос), или пользователь должен быть перенаправлен на представление результатов (заполненное данными из ответа, переданного в качестве модели представления).

Теперь мне сказали (и я испытал), что нельзя перенаправлять, когда сообщение было сделано с использованием AJAX. Итак, есть ли какой-нибудь способ перенаправить на другое представление и передать модель представления, если этот ответ был получен из репозитория, и просто отправить обратно объект Json, если должен быть показан результат диалога.

Действие моего контроллера, на которое отправляется поисковое представление, в настоящее время выглядит примерно так:

     [HttpPost]
    public ActionResult SomeAction(SearchRequest reqData)
    {
        ResponseBase response = worker.PerformSearch(reqData);

        if (response is ViewResponse)
        {
            //Redirect to "AnotherView" and pass response as the view model.
            return View("AnotherView", response as ViewResponse);
        }
        else if (response is DialogResponse)
        {
            //Return the Json object.
            return Json(new { type = "dialogresponse", data = response });
        }
        else
        {
            //To do: Put error handling code here.
            throw new NotImplementedException();
        }
    }
  

Ответ №1:

Этот вопрос немного устарел, но я подумал, что предложу свой вклад. У меня была похожая ситуация, когда мне пришлось создать сообщение и либо заполнить некоторый html-код на странице обновленным содержимым, либо перенаправить пользователя в новое местоположение. Вероятно, есть лучшие способы добиться этого, однако это то, что я сделал. Если вы используете jQuery для выполнения post, достаточно посмотреть на тип содержимого ответа; чтобы вернуть представление, просто сделайте, как вы делаете сейчас, и в функции успеха заполните содержимое. Если вы хотите перенаправить пользователя

         string javascript = "window.location.href='{0}';";
        return JavaScript(string.Format(javascript, returnUrl));
  

Платформа mvc прикрепит к ответу тип javascript mime, jQuery подберет его и выполнит javascript и перенаправит пользователя.
Единственная загвоздка в том, что javascript будет заполнен в html-контенте в вашем методе успеха. Чтобы преодолеть это, опросите тип содержимого для html, аналогичный here

Ответ №2:

Я бы посоветовал вам разделить его на два вызова. При первом вызове AJAX проверьте, является ли это ViewResponse или DialogResponse. Если ViewResponse выполняет другой вызов AJAX, чтобы получить фактический результирующий объект, в противном случае выполните вызов сервера, отличного от AJAX, для перенаправления на новое представление.