【问题标题】:IValidatableObject not triggeredIValidatableObject 未触发
【发布时间】:2011-11-22 02:25:29
【问题描述】:

我正在尝试使用此处描述的 IValidatableObject http://davidhayden.com/blog/dave/archive/2010/12/31/ASPNETMVC3ValidationIValidatableObject.aspx

但是当我尝试验证时它不会触发,ModelState.IsValid 始终是true

这是我的型号代码:

[MetadataType(typeof(RegistrationMetaData))]
public partial class Registration : DefaultModel
{
    [Editable(false)]
    [Display(Name = "Property one")]
    public int PropertyOne { get; set; }
}

public class RegistrationMetaData :IValidatableObject
{
    [Required(ErrorMessage = "Customer no. is required.")]
    [Display(Name = "Customer no.")]
    public string CustomerNo { get; set; }

    [Display(Name = "Comments")]
    public string Comments { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (new AccountModel().GetProfile(CustomerNo) == null)
            yield return new ValidationResult("Customer no. is not valid.", new[] { "CustomerNo" });
    }
}

我扩展了一个名为 Registration 的 LINQ to SQL 表,我的第一个猜测是这在 Meta 类上是不可能的,但我不确定?

我没有收到任何错误,它构建得很好,但是Validate 方法不会触发。我错过了什么?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 model-validation ivalidatableobject


    【解决方案1】:

    这是因为应该实现IValidatableObject而不是RegistrationMetaData的是Registration模型:

    [MetadataType(typeof(RegistrationMetaData))]
    public partial class Registration : IValidatableObject
    {
        [Editable(false)]
        [Display(Name = "Property one")]
        public int PropertyOne { get; set; }
    
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (new AccountModel().GetProfile(CustomerNo) == null)
                yield return new ValidationResult("Customer no. is not valid.", new[] { "CustomerNo" });
        }
    }
    
    public class RegistrationMetaData
    {
        [Required(ErrorMessage = "Customer no. is required.")]
        [Display(Name = "Customer no.")]
        public string CustomerNo { get; set; }
    
        [Display(Name = "Comments")]
        public string Comments { get; set; }
    }
    

    【讨论】:

    • 好吧,我以为是这样的。我的问题是我从Registration 上的DefaultModel 继承,据我所知,我不能从多个类继承。我该如何解决?
    • @Martin,您可以从单个类继承,但您可以实现任意数量的接口。 IValidatableObject 是一个接口。
    • 即使我将它与我放置数据注释的私有密封类一起使用,它也能工作吗?原因是它首先是一个数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多