2010-01-19 6 views
0

웹 사이트의 로그인 프로세스에서 MVC 모델을 사용하는 데 문제가 있습니다. 사용자 이름과 비밀번호를 입력하는 일반적인 로그인 화면이 있습니다. 계정 컨트롤러에는 로그인을 처리하는 두 가지 방법이 있습니다. 첫 번째는 로그인 뷰 (사용자 이름/pw)를 반환하는 "LogOn()"이라는 Get 메서드이고 두 번째는 "LogOn (FormCollection 값)"이라고도하지만 [AcceptVerbs (HttpVerbs.Post))]가 지정되었습니다.GET/POST 메서드 및 try-catch 블록이있는 ASP.NET MVC ModelState

사용자가 사용자 이름 및/또는 PW를 입력하지 않고 로그인하려고하면 POST 메서드가이를 확인하고 ModelState.AddModelEror()를 통해 ModelState에 오류를 추가합니다. 이것이 가장 먼저 일어나는 일이며, 유효성 검사가 끝난 후 ModelState.IsValidated()가 false이면 View()를 반환합니다. 하나가 비어있는 경우

//(validate just adds to Modelstate when values are null) 
if (!ValidateLogOn(userName, password)) 
    return View(); 

자,이 다음 페이지 그냥 반환 HtmlValidationMessage (키 이름)을 사용하여 올바른 오류 메시지를 표시합니다, 잘 작동합니다. 문제는 그것이 유효성을 확인한 후에 실제 login 호출을 만들어 try/catch 블록에 래핑 된 제공된 username/pw에 대한 인증 프로세스를 시작한다는 것입니다. 이 프로세스에서 오류가 발생하면 위에서 한 것처럼 ModelState에 오류를 추가하고 View()를 반환하고 싶습니다. 오류가 성공적으로 ModelState에 추가되고 뷰가 코드를 통해 올바르게 실행되지만 그 후에 어떻게 Get Logon() 메서드가 호출되고 모든 것을 덮어 쓰고 마치 View 인 것처럼 View를 표시합니다. 사용자는 처음 페이지를 방문합니다!

그래서 전체 코드 프로세스는 유사 아래에 게시 :

public ActionResult LogOn() 
{ 
    return View(); 
} 

public ActionResult LogOn(FormCollection values) 
{ 
    if (!ValidateLogOn(userName, password)) 
     return View(); 

    try { 
     loginProcess(username, password); 
    } 
    catch (Exception e) { 
     ModelState.AddModelError(keyName, "Error Message"); 
     return View(); 
    } 

    return View(); 
} 

이 과정이 크게 감상 할 수 않는 방식으로 작동하는 이유에 어떤 도움이나 통찰력, 감사합니다!

+1

첫째, 왜 try ... catch를 사용하고 있는데, 왜 loginProcess()가 bool을 반환하지 않았습니까? 둘째, 정확히 무슨 일이 일어나고 있는지 잘 모르겠다.보기가 렌더링되고 클라이언트에게 올바르게 보내지 는가? 그러면 고객이 리디렉션을하고 있습니까? 또는보기가 클라이언트로 전송되기 전에 어떻게 든 덮어 쓰여지고 있습니까? – roryf

+0

안녕하세요, Rory, 빠른 응답에 감사드립니다! loginProcess를 try/catch 블록으로 사용하는 이유는 잘못된 사용자 이름/pw, 데이터베이스 예외 등과 같이 전체 프로세스에서 발생할 수있는 여러 가지 예외를 감지하기 위해서입니다. 방화범이 가라 앉으면 게시물이 올바르게 발생하고 클라이언트. 그런 다음 덮어 쓰기를 수행하는 LogOn에 대한 GET이 요청됩니다. 그러나 POST에서 응답 HTML은 내 오류 메시지를 제외하고 모두 거기에 있습니다. HTML에는 <% = Html.ValidationMessage (keyName) %>가 있습니다. 다시 도움을 청합니다! – Trevor

답변

0

명시 적으로 값을 설정해야합니다. 사용자 이름에 대한 예제 :

ModelState.SetModelValue(
    "username", 
    new ValueProviderResult(username, username, CultureInfo.InvariantCulture)); 
+0

안녕하세요, 대린 감사합니다. 위의 줄을 추가하려고 시도한 다음 AddModelError()를 먼저 시도해 보았습니다. 왜냐하면 SetModelValue()를 시도하면 ModelState.IsValid가 false로 설정되지 않기 때문입니다. 그러나이 방법으로 문제가 해결되지 않고 겹쳐 쓰기 호출이 계속 발생합니다. 다른 아이디어 ?? – Trevor