2011-01-06 4 views
1

시나리오 :MVC2 AJAX - 반환 된 데이터를 기반으로 결정 UpdateTargetId

내가 MVC2 응용 프로그램에 대한 로그인 양식을 만드는거야.

어떻게 그것을를하고 있어요 :

형태는 사용자 이름/암호의 유효성을 확인 MVC2 액션에 제출합니다. 유효성 검증에 실패하면 조치는 사용자가 다시 시도 할 양식 (부분보기)을 리턴합니다. 유효성 검사를 통과하면 조치는 사용자가 로그인하기 전에 방문한 페이지 (보기)를 리턴합니다. 내가 일이 원하는 것은

:

1 - 양식을 제출하고 사용자가 성공적으로 유효성을 검사 할 때 (어떤 일이처럼 당신이 UpdateTargetId을 설정하지 않은 경우), 반환 된 결과가 현재 페이지를 교체해야합니다 .

2 - 양식이 제출되고 사용자가 유효성 검사에 실패하면 반환 된 결과가 양식을 대체해야합니다 (예 : UpdateTargetID를 양식의 포함 요소로 설정 한 경우).

이 문제는 :

나는하지만 동시에, 그런 것들 모두 작동 할 수 있습니다. 항상 현재 페이지를 바꾸거나 항상 UpdateTargetId 요소의 내용을 바꿀 수 있습니다. 하지만 사용자가 성공적으로 검증했는지 여부에 따라 둘 중 하나를 수행 할 수 있어야합니다.

내가

필요 어떤 이상적인 솔루션은 아약스 요청의 결과를 검토하고 (전체 페이지 교체)을 (단지 형태로 대체) UpdateTargetId 사용 여부를 결정할 수있을 것 . jquery (가능한 경우)를 사용하여 작업하는 것이 좋겠지 만 jquery로는별로 좋지는 않지만 직접 처리하는 방법을 찾아야합니다. 이런 식으로 할 수 없다면 나는 비슷한 방식으로 작동하도록 다른 방법/솔루션에 대해서도 열려 있습니다.

미리 감사드립니다.

요청대로. 액션 코드. 그러나 나는 말했다. 모든 mvc 응용 프로그램과 함께 기본 제공되는 표준 LogOn 작업입니다. 유일한 차이점은 유효성 검사가 실패하면 부분 뷰를 반환한다는 것입니다.

[HttpPost] 
    [MedLife.Code.Compression.CompressFilter] 
    public ActionResult SignIn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       if (!String.IsNullOrEmpty(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 
       else 
       { 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return PartialView("Overlays/LoginControl", model); 
    } 

답변

1

로그인/암호가 유효하지 않은 경우 "INVALID"문자열의 Json 결과를 반환한다고 가정 해 봅시다. 그런 다음 UpdateTargetId를 사용합니다.

Json 결과! = "INVALID"이면 컨테이너를 새 부분 페이지로 바꿉니다.

그것이 내가하는 방식이며 훌륭하게 작동합니다. :-)

+0

좋습니다. 문제가 더 많습니다 ** 어떻게 ** UpdateTargetId를 사용하도록 설정했는지 여부입니다. 나는 아약스에서 UpdateTargetId를 설정한다. 어떻게 당신이 제안하는 것처럼이 문자열이 있는지 여부에 따라 프로그래밍 방식으로 사용할지 여부를 결정합니다. – DanielJW

+0

이런 식으로 (또는 적어도 이와 비슷한 방식으로) 허용하는 방식으로 작동하도록했습니다. – DanielJW

1

서버 측 코드에서 유효성 검사가 작동하는지 확인하고 그렇지 않은 경우 필요한 전체보기로 RedirectToAction을 반환하십시오.

문제는 디스플레이 논리와 달리 모든 응용 프로그램 논리이므로 문제가 분리되도록보기보다는 컨트롤러에서 수행해야합니다.

RedirectToAction (즉, View ("myViewWhenInvalid");) 만 반환하면 안됩니다. 그렇지 않으면보기가 UpdateTargetID에 렌더링되고보기에는 좋지 않을 수 있습니다.

편집 :

즉 :

public ActionResult myLoginAction(string name, string pwd) 
{ 
// do the login stuff 
if (loggedIn) 
{ 
return RedirectToAction(...); 
} 
else 
{ 
return MyJsonAction(); 
} 
} 

public MyJsonAction() 
{ 
return some Json...; 
} 

PS : 나는 감기 때문에 꺼렸 내 생각을 확인해야합니다.

+0

+1 리디렉션은 전체 페이지를 "바꾸기"위해 이동하는 방법입니다. – jgauffin

+0

모든 응용 프로그램 논리가 이미 작동합니다. 로그인이 성공하면 컨트롤러는 이미 RedirectToAction을 반환합니다. 문제는 ajax 요청의 결과를 표시하는 방법입니다. 로그인이 성공하면 반환 된 결과는 전체 페이지이며 현재 전체 페이지를 대체해야합니다. 로그인이 실패한 경우 반환 된 결과는 부분보기이므로 대상 div를 대체해야합니다. 나는 그 두 가지 중 하나 또는 다른 것을 할 수 있습니다. 하지만 어떤 결과가 반환되었는지에 따라 어떤 것을 선택하도록 할 수는 없습니다. 그게 내 문제 야. – DanielJW

+0

문제가 어떻게 작동해야하는지에 대한 귀하의 기대와 같다고 들립니다. 즉, 당신은 틀과 싸우고 있습니다. 새로운 프로젝트는 모든 회원 정보를 다루는 AccountController를 사용할 준비가되어 만들어집니다. 그걸 사용해 보셨나요? – awrigley

관련 문제