验证自定义验证属性时如何在ModelState中指定数组索引?

时间:2015-04-02 18:48:03

标签: asp.net-mvc validation asp.net-web-api modelstate

我有以下型号(简化版):

public class AddZoneModel
{    
    /// <summary>
    /// Gets or sets the name of the zone.
    /// </summary>
    [Required]
    public string Name { get; set; }
    /// <summary>
    /// Gets or sets the minimum of optimal disponibilities.
    /// </summary>
    [Required]
    [DisponibilityCollection]
    public int[] Disponibilities { get; set; }
}

整数数组应该有12个(每月)值,每个值都在数据库的范围内。 这在以下属性中验证:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class DisponibilityCollectionAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var values = value as int[];

        if (values == null || values.Length != 12)
        {
            return new ValidationResult("The specified object is not a collection of 12 integers", new string[] { validationContext.MemberName });
        }

        using (AdminRepository db = new AdminRepository())
        {
            ValidationRangesModel ranges = db.GetValidationRanges();

            int min = ranges.MinimumDisponibilidad;
            int max = ranges.MaximumDisponibilidad;

            var errorMembers = new List<string>();

            for (int i = 0; i < 12; ++i)
            {
                if (values[i] < min || values[i] > max)
                {
                    errorMembers.Add(string.Format("Disponibilities[{0}]", i));
                }
            }

            if (errorMembers.Count > 0)
                return new ValidationResult(string.Format("Disponibilidad should be between {0} and {1}", min, max), errorMembers);
        }

        return ValidationResult.Success;
    }
}

如果ModelState无效,我的API将返回一个JSON对象,其中包含模型状态错误的解析版本。

问题是验证的数组不显示哪个项无效。 ModelState只包含一个数组属性本身"Disponibilities"的消息。 这打破了错误验证,因为我有12个文本框。 (实际上我有超过12个文本框,因为模式会重复。这是简化的)

如何自定义属性名称,使它们像“Disponibilities [2]”或“Disponibilities_2_”,这样我可以用JS识别适当的控件并显示验证错误?

0 个答案:

没有答案