我有以下型号(简化版):
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识别适当的控件并显示验证错误?