自定义数据注释IsValid从不调用。 (ASP.NET MVC 2 .NET 4)

我已经创建了一个自定义的数据验证属性,以确保用户输入的密码相同,但从不调用IsValid。

自定义属性:

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);
}

我看到MVC2有类似/相同/相关的问题 - 只有在所有属性都正确验证的情况下才会调用类级验证。

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

我没有调用TryValidateModel()。


您是否尝试过填写所有其他字段,以便满足所有即用型验证,并查看您的自定义验证是否已触发? 如果客户端验证不满意,表单将被阻止回发,从而您的服务器端自定义验证不会被激怒,

为了让您的自定义验证属性在客户端工作,需要做一些额外的工作。

阅读Phil在这里验证的优秀文章:http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

链接地址: http://www.djcxy.com/p/1659.html

上一篇: Custom Data Annotations IsValid is never invoked. (ASP.NET MVC 2 .NET 4)

下一篇: Java socket not throwing exceptions on a dead socket?