2012-07-13 3 views
0

EmailAddress 맞춤 데이터 주석 속성이 이메일의 유효성을 올바르게 검사하도록 노력하고 있으며 테스트에서 나에게 적합하지 않은 것으로 보입니다.서버 측 맞춤 데이터 주석 유효성 검사 MVC 3

<!-- language: c# --> 
public static void ValidateModel<T>(this Controller controller, T model) 
    { 
     var validationContext = new ValidationContext(model, null, null); 
     var validationResults = new List<ValidationResult>(); 
     Validator.TryValidateObject(model, validationContext, validationResults); 
     foreach (var validationResult in validationResults) 
     { 
      controller.ModelState.AddModelError(validationResult.MemberNames.First(), validationResult.ErrorMessage); 
     } 
    } 

모델 :

<!-- language: c# --> 
public partial class SubscriberModel 
{ 
    public int SubscriberID { get; set; } 

    [Required] 
    [DisplayName("First Name")] 
    public string FirstName { get; set; } 

    [Required] 
    [DisplayName("Last Name")] 
    public string LastName { get; set; } 

    [Required] 
    [EmailAddress] 
    [Compare("ConfirmEmail", ErrorMessage = "The emails must match")] 
    [DisplayName("E-mail")] 
    public string Email { get; set; } 

    [Required] 
    [DisplayName("Confirm E-mail")] 
    public string ConfirmEmail { get; set; } 

    [Required] 
    [DisplayName("Date Subscribed")] 
    public DateTime DateSubscribed { get; set; } 
} 

컨트롤러 :

public partial class SubscriptionController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [CaptchaValidator] 
    [HttpPost] 
    public ActionResult Index(SubscriberModel subscription, bool captchaValid) 
    { 
     subscription.DateSubscribed = DateTime.Now; 
     ModelStateValid = ModelState.IsValid; 

     if(captchaValid) 
     { 
      if (ModelState.IsValid) 
      { 
       var test = ""; 
      } 
     } 

     return View(subscription); 
    } 
} 
01,235,164

여기 ValidateModel 방법이다
[Test] 
    public void ModelStateValidation() 
    { 
     var invalidEmails = new[] { "testtestcom", "[email protected]", "testtest.com" }; 
     var validEmail = "[email protected]"; 

     //Invalid Email addresses 
     foreach (var invalidEmail in invalidEmails) 
     { 
      var subscription = new SubscriberModel() { FirstName = "f", LastName = "l", Email = invalidEmail, ConfirmEmail = invalidEmail, DateSubscribed = DateTime.Now }; 
      ValidateModelAsFalse(subscription); 
     } 

     var subscription2 = new SubscriberModel() { FirstName = "f", LastName = "l", Email = "t", ConfirmEmail = "t", DateSubscribed = DateTime.Now }; 
     ValidateModelAsFalse(subscription2); 

     //Valid Email address 
     var subscription3 = new SubscriberModel() { FirstName = "f", LastName = "l", Email = validEmail, ConfirmEmail = validEmail, DateSubscribed = DateTime.Now }; 
     ValidateModelAsTrue(subscription3); 

     //Last Name doesn't exists 
     var subscription4 = new SubscriberModel() { FirstName = "f", LastName = "", Email = validEmail, ConfirmEmail = validEmail, DateSubscribed = DateTime.Now }; 
     ValidateModelAsFalse(subscription4); 

     //First Name doesn't exists 
     var subscription5 = new SubscriberModel() { FirstName = "", LastName = "l", Email = validEmail, ConfirmEmail = validEmail, DateSubscribed = DateTime.Now }; 
     ValidateModelAsFalse(subscription5); 

     //Email addresses are equal 
     var subscription6 = new SubscriberModel() { FirstName = "f", LastName = "l", Email = "[email protected]", ConfirmEmail = "[email protected]", DateSubscribed = DateTime.Now }; 
     ValidateModelAsFalse(subscription6); 
    } 

    private static void ValidateModelAsFalse(SubscriberModel subscription3) 
    { 
     SubscriptionController controller = new SubscriptionController(); 
     controller.ValidateModel(subscription3); 
     AssertIsFalse(controller); 
    } 

    private static void ValidateModelAsTrue(SubscriberModel subscription3) 
    { 
     SubscriptionController controller = new SubscriptionController(); 
     controller.ValidateModel(subscription3); 
     AssertIsTrue(controller); 
    } 

    private static void AssertIsTrue(SubscriptionController controller) 
    { 
     Assert.That(controller.ModelState.IsValid, Is.True); 
    } 

    private static void AssertIsFalse(SubscriptionController controller) 
    { 
     Assert.That(controller.ModelState.IsValid, Is.False); 
    } 

: 여기

테스트입니다

EmailAttribute 클래스 : 내가 의도 한대로

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] 
public sealed class EmailAddressAttribute : ValidationAttribute, IClientValidatable 
{ 
    private static Regex _regex = new Regex(@"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$", RegexOptions.Compiled | RegexOptions.IgnoreCase); 

    public EmailAddressAttribute() 
     : base() 
    { 
     ErrorMessage = "Invalid Email"; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
     yield return new ModelClientValidationRule { 
      ValidationType = "email", 
      ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()) 
     }; 
    } 

    public override bool IsValid(object value) 
    { 
     if (value == null) { 
      return false; 
     } 

     string valueAsString = value as string; 
     return _regex.Match(valueAsString).Success; 
    } 
} 

IsValid 방법은 전자 메일 주소의 유효성을 검사하는 것 같다,하지만 난 Controller.ValidateModel에 단위 테스트를 실행하는 이동 어떤 이유로, 그것은 거짓과 일치하는 항목을 반환하지 않습니다 내 주장.

답변

0

나는 이것을 한 번 사용하고 IClientValidatable 인터페이스를 구현하는 것이 첫 번째 단계 일뿐입니다. 그런 다음 jQuery 유효성 검사를 클라이언트 측에 추가해야했습니다.

<script type="text/javascript"> 
    (function ($) { 
     $.validator.addMethod("yourValidationTypeName", function (value, element) { 
      //do validation here 
     }); 
     $.validator.unobtrusive.adapters.addBool("yourValidationTypeName"); 
    } (jQuery)); 
</script> 

unobtusive 자바 스크립트와 클라이언트 유효성 검사 속성 [으로 RegularExpression]에 내장 된이 문제를 해결할 수있는 활성화 사용 : 나는 정의 검증은 여기

jQuery를

를 사용하여 클라이언트에서 실행 할 수 있다고 생각하는 것은 예입니다. 내가 틀렸다면

저를 수정,하지만 난 MVC3와 전문가가 아니에요

+0

은 감사하지만, 클라이언트 측 유효성 검사가 잘 작동, 내가 서버 측 유효성 검사 테스트를 –

+0

인가 통과 얻을 수없는 것을 단지 양식을 제출할 때 액세스 한 IsValid() 메서드? –

+0

예, IsValid 메서드에서 중단 점을 설정하면 양식을 제출할 때 코드가 올바르게 흐르게됩니다. –

관련 문제