3

在 ASP.NET MVC3 应用程序中,我有一个模型,它表示具有典型名称、StreetAddress 1 和 2、City、Region、PostalCode 和 Country 属性的用户地址。该模型当前具有适用于美国地址的 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() 调用时让服务器端模型正确验证?

4

1 回答 1

2

通过复杂的验证,我发现最容易实现IValidatableObject接口

IEnumerable<ValidationResult> Validate(
    ValidationContext validationContext
)

基本上是这样的

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

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

于 2012-06-01T13:12:19.170 回答