2010-06-29 53 views
7

我有一个自定义的数据验证属性,我已经创建,以确保用户输入的密码相同,但从不调用IsValid。自定义数据注释IsValid永远不会被调用。 (ASP.NET MVC 2 .NET 4)

自定义属性:

public class IsSameAsAttribute : ValidationAttribute 
{ 
    public String TargetProperty { get; set; } 
    private readonly object _typeId = new object(); 

    public IsSameAsAttribute(string targetProperty) 
    { 
     TargetProperty = targetProperty; 
    } 

    public override bool IsValid(object value) 
    { 
     return false; 
     //Type objectType = value.GetType(); 
     //bool isValid = false; 

     //PropertyInfo[] neededProperties = 
     // objectType.GetProperties().Where(propertyInfo => propertyInfo.Name == TargetProperty).ToArray(); 

     //return isValid; 
    } 

    public override object TypeId 
    { 
     get { return _typeId; } 
    } 
} 

数据模型将它应用到:

public class RegistrationData 
{ 
    [Required(ErrorMessage = "First Name Required")] 
    [StringLength(100, ErrorMessage = "First Name must be 100 characters or less.")] 
    public String FirstName { get; set;} 

    [Required(ErrorMessage = "Last Name Required")] 
    [StringLength(100, ErrorMessage = "Last Name must be 100 characters or less.")] 
    public String LastName { get; set; } 

    [Required(ErrorMessage = "Email is Required")] 
    [StringLength(200, ErrorMessage = "Email must be 200 characters or less.")] 
    [RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Valid Email Address is required.")] 
    public String Email { get; set; } 

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

    [IsSameAs("Password")] 
    public String PasswordRepeat { get; set; } 

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

} 

而且,它从叫做控制器:

[HttpPost] 
public ActionResult ValidationDemo(RegistrationData model) 
{ 
    if (ModelState.IsValid) 
    { 
     return Redirect("/"); 
    } 

    return View(model); 
} 

所有“开箱即用”的验证操作都是正确的,它只是我自定义的一个,没有被调用。在进行调试时,我发现它在调用构造函数时被实例化,但IsValid上的断点永远不会被打中。

怎么回事,我该如何解决?

UPDATE

好吧,我摆弄一些,如果我在我的控制器调用TryUpdateModel(模型),它最终调用的IsValid。所以这意味着我的自定义属性没有得到任何运行MVC 2验证的“注册”。有没有办法解决这个问题?

[HttpPost] 
public ActionResult ValidationDemo(RegistrationData model) 
{ 
    TryValidateModel(model); // <--- *** Added this line and it "works" 

    if (ModelState.IsValid) 
    { 
     return Redirect("/"); 
    } 

    return View(model); 
} 
+1

你有没有注册一个适配器与你的自定义验证属性一起使用'DataAnnotationsModelValidatorProvider.RegisterAdapter'? – 2011-05-10 21:44:35

回答

0

你试过填写所有其他字段,以便所有外的开箱验证满意,看看您的自定义的验证被触发? 如果客户端验证不满意,表单将被阻止回发,从而您的服务器端自定义验证不会被激怒,

要使您的自定义验证属性在客户端工作,一些额外的工作有被制造。

上验证这里阅读上菲尔的优秀帖子: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

+0

目前,我没有进行客户端验证,试图使其发挥作用。至少我不认为我是。嗯,我应该检查一下。但是,我在控制器中运行ModelState.IsValid中的断点,并且模型的错误集合从未出现错误状态,这是我的自定义验证项目。 是的,在更新之前,我填写了表单,但仍未触发自定义验证属性。 :( – Jack 2010-06-29 23:03:28

+0

嗯,所以我的假设是错误的,这真的很奇怪。你可以为你发布代码[HttpGet]方法和视图吗? – 2010-06-29 23:34:32

3

我看到有MVC2类似/相同/相关的问题 - 类级别的验证被称为只有所有属性正确验证。

因此,多个属性可能会失败,并且所有验证消息都会添加到模型状态(并显示在客户端上)。但是类级验证消息不在其中;只有属性通过时才会调用这些IsValid。从可用性的角度来看,这有点令人失望,但它起作用。

我是而不是调用TryValidateModel()。

相关问题