2011-11-24 6 views
0

MVC 페이지를 통해 편집중인 EF 코드 첫 번째 모델이 있는데, [필수] 데이터 주석을 사용하여 항상 false를 반환하는 특정 필드가 있습니다. 유효성 검사를하기 전에 바로 값을 설정하면 여전히 실패합니다.필수 검사기는 항상 false를 반환합니다.

'사용자 이름'속성으로 사용자 이름이나 이메일 주소를 사용하는 경우 구성 할 수있는 사용자 개체 용입니다.

모델 :이 필요한 않다면 내보기에서

public class User { 
    [DisplayName("User Id")] 
    public int Id { get; set; } 

    [Required(ErrorMessage="Username is required")] 
    public string Username { get; set; } 

    [UIHint("EmailAddress")] 
    [Required(ErrorMessage = "Email is required")] 
    [EmailAddress] 
    public string Email { get; set; } 
} 

, 난 단지 Username 편집기를 그리기 해요 :

@if (@ViewBag.LoginMethod == "username") { 
    @Html.LabelFor(m => m.Username) 
    @Html.TextBoxFor(m => m.Username, new { autocomplete = "off" }) 
    @Html.ValidationMessageFor(m => m.Username) 
} 

@Html.LabelFor(m => m.Email) 
@Html.TextBoxFor(m => m.Email, new { autocomplete = "off" }) 
@Html.ValidationMessageFor(m => m.Email) 

내 컨트롤러 : 당신이 할 수

[HttpPost] 
public ActionResult Create(UserModel viewModel) { 
     ViewBag.LoginMethod = this.loginMethod.ToString(); 

     var user = new User(); 
     if (this.loginMethod == LoginMethods.Username) 
      user.Username = viewModel.User.Username; 
     else 
      user.Username = viewModel.User.Email; 

     user.Email = viewModel.User.Email; 
     user.FirstName = viewModel.User.FirstName; 
     user.LastName = viewModel.User.LastName; 

     user.Username = "TEST"; 
     if (TryValidateModel(user) == false) { 
      this.FlashError("Validation Errors!"); 
      return View(viewModel); 
     } 

     throw new Exception("here"); 
} 

User.Username 속성은 login 메서드를 기반으로 설정합니다. 테스트를 위해 유효성 확인 바로 전에 "테스트"로 설정합니다. Username Required 유효성 검사가 false를 반환하고 내보기로 돌아갑니다. 나는 예외에 결코 도착하지 않는다.

아무리 페이지에 사용자 이름 편집기를 렌더링하면 제대로 작동합니다. 클라이언트 측 유효성 검사가 활성화되어 있으므로 값을 입력하지 않고 양식을 제출할 수 없으며 유효합니다. 사용자 이름 값이 검증 된 후에도 여전히 "TEST"인 경우에도 작동합니다.

나는 TryValidateModel이 올바른 기능이 아니라고 생각하기 시작했습니다. ModelState.IsValid을 사용하면 동일한 결과가 발생하며 잘못된 필수 오류가 발생합니다.

답변

0

먼저, 편집 (EditFor)을 사용하여 매번 컨트롤의 트리오 (label, textbox, validator)를 생성하지 않아야한다고 생각합니다.

나를 괴롭히는 또 다른 일은 모델이 사용자 (m.Email) 유형 인 것처럼 보이지만 작업에 UserModel (사용자 포함)이 필요하다는 것입니다. 왜 코드가 여전히 작동하는지 잘 모르겠습니다. 보통 사용자를 매개 변수로 직접 사용할 수 있습니다 (따라서 값을 직접 복사 할 필요가 없습니다).

ModelState.IsValid가 작동하지 않는 것이 정상입니다. 모델 유형이 User 인 경우 뷰에 있는지 여부에 관계없이 모든 POSTED 속성의 유효성을 검사합니다. 반면에, TryValidateModel은 시나리오에서 작동해야합니다 (SHOULD). 거기에 거기에 편집 컨트롤이없는 속성을 비워 추가 보안 기능이있어 보인다. 해결 방법 해결 방법은 User 객체에 대한 사용자 정의 모델 바인더를 직접 작성하는 것입니다. 그렇게 어렵지는 않지만 IModelBinder를 상속하고 BindModel을 재정의하고 기본 메소드를 호출 한 다음 UserName이 비어 있으면 "TEST"를 추가하거나 물론 올바른 값입니다.) 물론 비워 둘 수는 없습니다. Asp.net MVC에서 사용자 정의 모델 바인더를 검색하십시오.

도움이 되었기를 바랍니다.

+0

뷰 모델, 사용자 및 인증 정보가 첨부 된 구성원 개체 (암호, 로그인 타임 스탬프 등)의 두 가지 모델이 있습니다. 나는 당신이 "추가 보안 기능"에 대해 옳다고 생각합니다. 이 시점에서, 나는 새로운 User 객체를 생성하고 FormCollection에서 그것을 수동으로 채우는 것을보고있다. – mattdwen

+0

지연된 응답에 대해 유감스럽게 생각합니다 (아직 인터페이스에 익숙하지 않습니다). 어떻게 된거야? 수동 인구 경로를 따라 간다면 아마도 ModelBinder를 만드는 것이 더 흥미로울 것입니다. 그렇게하면 User 객체를 보내는 모든 곳에서이 코드를 재사용 할 수 있습니다. 또한 ModelBinder에는 수작업으로 도울 수있는 흥미로운 보호 방법이 있습니다. –

관련 문제