MVC 3验证:如何在特定用例中覆盖DataAnnotations属性?

时间:2012-06-01 13:09:03

标签: asp.net-mvc-3 validation data-annotations

在ASP.NET MVC3应用程序中,我有一个代表具有典型名称,街道地址1和1的用户地址的模型。 2,城市,地区,邮政编码和国家物业。该模型当前具有适用于US地址的DataAnnotation属性。我现在需要支持具有不同验证和消息的国际地址,具体取决于模型中包含的Country值。当国家/地区像印度或日本而不是美国时,如何定义和覆盖现有的美国DataAnnotation属性值?

例如,现有的PostalCode属性定义如下:

    private string _postalCode;
    [StringLength(10, ErrorMessage = "Zip Code maximum length 10 characters")]
    [Display(Name = "Zip Code")]
    [Required(ErrorMessage = "Zip Code is required")]
    [RegularExpression(@"^\d{5}(-\d{4})?$", ErrorMessage = "Invalid Zip Code")]
    public string PostalCode
    {
        get { return _postalCode; }
        set
        {
            if (_postalCode != value)
            {
                _postalCode = value;
            }
        }
    }

我知道如果我有一个特定的印度地址模型,那么邮政编码看起来像这样:

    private string _postalCode;
    [StringLength(6, ErrorMessage = "Postal Code maximum length 6 characters")]
    [Display(Name = "Postal Code")]
    [Required(ErrorMessage = "Postal Code is required")]
    [RegularExpression(@"^([0-9]{6})$", ErrorMessage = "Invalid Postal Code")]
    public string PostalCode
    {
        get { return _postalCode; }
        set
        {
            if (_postalCode != value)
            {
                _postalCode = value;
            }
        }
    }

当用户选择特定国家/地区时,如何使用此模型实施正确的客户端和服务器端验证?

我希望在更改国家/地区时执行ajax调用以检索更新的部分视图,或者向客户端发送足够的数据,以便通过修改输入上的相应属性来调整客户端提示和验证元素和重置验证,但如何在发出Model.IsValid()调用时让服务器端模型正确验证?

1 个答案:

答案 0 :(得分:2)

通过复杂的验证,我发现imeplement IValidatableObject interface

最容易
IEnumerable<ValidationResult> Validate(
    ValidationContext validationContext
)

基本上是这样的

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        MyAddress model = validationContext.ObjectInstance as MyAddress;
        if (model.Country == "India")
        {
            // validate as india
        }
    }

这与默认验证系统无缝集成,因此您不需要任何其他配置。但要注意,这只是服务器端验证。