programing

asp.net mvc 4에서 jquery ajax 호출 후 서버측 리디렉션

powerit 2023. 9. 20. 20:46
반응형

asp.net mvc 4에서 jquery ajax 호출 후 서버측 리디렉션

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.
        }
    }

하지만 문제점은 다음과 같습니다.

  1. 이 메서드가 'ActionResult'를 반환하면 오류가 발생합니다.not all code paths return a value.

  2. void를 사용하면 아무것도 반품할 수 없습니다.

  3. 리턴 없이 'void'를 사용해도 jQuery AJAX 호출의 비동기성으로 인해 다른 컨트롤러나 뷰로 리디렉션하지 못하고 있습니다.

그러한 시나리오를 처리할 수 있는 기술이 있습니까?

return일반적으로 메소드에서 더 이상의 문장을 실행하지 않고 반환됩니다.else부품은 필요 없습니다.이렇게 하면 1번 문제를 해결할 수 있습니다.

리디렉션에 관해서는 일종의 redirect 명령을 반환하지 않는 이유는 다음과 같습니다.

[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")});
}

그리고 자바스크립트로:

$.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;
  }
 });

이것은 저를 도와줍니다.

return JavaScript("window.location = '/'");

참조 링크 ASP를 얻는 방법.새 페이지로 리디렉션하는 NET MVC Ajax 응답...

이 작업을 수행해야 했지만 클라이언트를 로그인 페이지로 리디렉션하기 위해 회피해야 했던 자바스크립트 구문 분석 오류라는 극단적인 요구 사항을 충족하는 솔루션은 없었습니다.

사용자 지정 Authorization 특성에서 간단한 "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;
    }
});

하지만 저는 이 방법을 추천하지 않습니다.이렇게 해야 한다면, 적어도 http response 헤더 안에 "NOAUTH" 값을 넣은 다음 글로벌 JQuery complete handler에서 값을 읽어보는 것을 제안합니다.

서버측:

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

클라이언트 측:

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

dataFilter를 사용하는 것이 이벤트 핸들러가 타격을 받기 전에 ajax 요청을 가로챌 수 있는 유일한 방법입니다.

언급URL : https://stackoverflow.com/questions/19795198/server-side-redirection-after-jquery-ajax-call-in-asp-net-mvc-4

반응형