#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, для перенаправления на новое представление.