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에 단위 테스트를 실행하는 이동 어떤 이유로, 그것은 거짓과 일치하는 항목을 반환하지 않습니다 내 주장.
은 감사하지만, 클라이언트 측 유효성 검사가 잘 작동, 내가 서버 측 유효성 검사 테스트를 –
인가 통과 얻을 수없는 것을 단지 양식을 제출할 때 액세스 한 IsValid() 메서드? –
예, IsValid 메서드에서 중단 점을 설정하면 양식을 제출할 때 코드가 올바르게 흐르게됩니다. –