использование DataAnnotations для проверки модели, не работает - PullRequest
2 голосов
/ 20 июля 2011

У меня есть этот код на сущности, созданной с использованием EF 4:

[MetadataType(typeof(MemberMetaData))]
public partial class Member
{
    public string ConfirmPassword { get; set; }

    [PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "Password and confirm password do not match.")]
    public class MemberMetaData
    {
        [Required(ErrorMessage = "Email is required.")]
        [DataType(DataType.EmailAddress, ErrorMessage = "Email is invalid.")]
        //[RegularExpression(@"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$")]
        public object Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [DisplayName("Password")]
        public object Password { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [DisplayName("Confirm Password")]
        public object ConfirmPassword { get; set; }
    }
}

Свойствами участников в сущности Member являются пока Email и пароль.

Я пытаюсь использоватьаннотации данных для возврата сообщения о проверке обратно в представление и создания модульного теста следующим образом:

    [TestMethod]
    public void register_post_displays_error_when_email_not_entered()
    {
        // Arrange
        Member model = new Member()
        {
            Email = "",
            Password = "test123",
            ConfirmPassword = "test123"
        };
        // Act
        var result = _controller.Register(model) as ViewResult;
        // Assert
        Assert.AreEqual("Email is required.", result.ViewData.ModelState["Email"].Errors[0].ErrorMessage);
    }

Это не удается, когда я вхожу в контроллер ModelState.IsValid всегда имеет значение true.Вот мое действие контроллера:

 [HttpPost]
         public ActionResult Register(Member model)
         {
             if (ModelState.IsValid)
             { //register
             }

             // If we got this far, something failed, redisplay form
             return View("Register");
         }

Почему это не работает?

1 Ответ

2 голосов
/ 20 июля 2011

Ознакомьтесь с этим учебным пособием

Связыватель модели не вызывается, поэтому проверка не выполняется.

Вы можете сделать это вручную, используя следующую команду

var validationContext = new ValidationContext(user, null, null);
var validationResults = new List<ValidationResult>();
Validator.TryValidateObject(user, validationContext, validationResults);
foreach (var validationResult in validationResults)
{
    controller.ModelState.AddModelError(validationResult.MemberNames.First(), validationResult.ErrorMessage);
}
...