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

Перенаправление на стороне сервера после вызова jquery ajax в asp.net mvc 4

Я отправляю регистрационную информацию с вызова JQuery AJAX на контроллер MVC 4:

   $.post(url, data, function (response) {
      if (response=='InvalidLogin') {
          //show invalid login
      }
      else if (response == 'Error') {
          //show error
      }
      else {
          //redirecting to main page from here for the time being.
          window.location.replace("http://localhost:1378/Dashboard/Index");
      }
   });

Если вход успешно завершен, я хочу перенаправить пользователя с серверной стороны на соответствующую страницу по типу пользователя. Если сбой входа в систему, строка возвращается пользователю:

    [HttpPost]
    public ActionResult Index(LoginModel loginData)
    {
        if (login fails)
        {
            return Json("InvalidLogin", JsonRequestBehavior.AllowGet);
        }
        else
        {
             // I want to redirect to another controller, view, or action depending
             // on user type.
        }
    }

Но есть проблемы:

  • Если этот метод возвращает "ActionResult", я получаю сообщение об ошибке not all code paths return a value.

  • Если я использую 'void', я ничего не могу вернуть.

  • Даже если я использую "void" без возврата, я не могу перенаправить на другой контроллер или просмотр из-за асинхронного вызова вызовов jQuery AJAX.

Существуют ли какие-либо методы для обработки таких сценариев?

4b9b3361

Ответ 1

return обычно возвращается из метода без выполнения каких-либо дополнительных инструкций, поэтому else часть не требуется. Таким образом вы избавитесь от проблемы №1.

Что касается перенаправления, почему бы не вернуть какую-либо команду перенаправления:

[HttpPost]
public ActionResult Index(LoginModel loginData)
{
    if (login fails)
    {
        return Json(new {result = "InvalidLogin"}, JsonRequestBehavior.AllowGet);
    }
    return Json(new {result = "Redirect", url = Url.Action("MyAction", "MyController")});
}

А затем в javascript:

$.post(url, data, function (response) {
  if (response.result == 'InvalidLogin') {
      //show invalid login
  }
  else if (response.result == 'Error') {
      //show error
  }
  else if (response.result == 'Redirect'){
      //redirecting to main page from here for the time being.
      window.location = response.url;
  }
 });

Ответ 3

Мне пришлось это сделать, но ни одно из решений, которые я нашел, не удовлетворило моими крайними требованиями JavaScript-анализа ошибок, которые я должен был избежать, чтобы перенаправить клиента на страницу входа.

То, что я сделал, это отправить простой ответ "NOAUTH" из моего настраиваемого атрибута авторизации, затем перехватить ответ Ajax до того, как будут обработаны все обработчики событий, и перенаправить пользователя, установив window.location.

Серверная сторона:

protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
    if (context.RequestContext.HttpContext.Request.IsAjaxRequest())
    {
        var result = new ContentResult {Content = "NOAUTH"};
        context.Result = result;
        return;
    }
}

Затем на стороне клиента:

$.ajaxSetup({
    dataFilter: function (data, type) {
        if (data !== "" && data === "NOAUTH") {
            window.location = '/';
        }
        return data;
    }
});

Я бы не рекомендовал этот подход. Если вам нужно это сделать, я бы, по крайней мере, предложил вместо этого добавить значение "NOAUTH" в заголовок ответа HTTP, а затем прочитать значение в глобальном обработчике JQuery.

Серверная сторона:

HttpContext.Current.Response.AddHeader("NOAUTH", "1");

на стороне клиента:

$.ajaxSetup({
    complete: function (jqXHR, textStatus) {
        if (jqXHR.getResponseHeader("NOAUTH") === '1')
            window.location = '/';
    }
});

Обратите внимание, что использование dataFilter - это метод только для перехвата запросов ajax до того, как будут удалены любые другие ваши обработчики событий.