我有一个带有几个属性的模型,我在上一个问题中实现了Darin的答案:ASP.NET MVC: Custom Validation by DataAnnotation。这使我能够一次验证4个属性(因为我需要它们一起不超过一定的长度)。
问题是,当我使用此自定义验证器仅对4个属性中的1个进行Annon时,只有该文本框的backgroundcolor在验证失败时才会变为红色。当我宣布所有4个属性时,所有4个文本框都将变为红色,但错误消息将显示4次。这很难看。所以我设置了@ Html.ValidationSummary(false),因此错误消息会在摘要中进行,但会汇总所有4条错误消息(这是合乎逻辑的)。
如何让所有4个文本框变为红色,以确保错误消息只显示一次?
提前感谢您帮助这个MVC菜鸟。欣赏它。
答案 0 :(得分:0)
我还没有测试过,但我认为解决办法可能是将{Members}列表传递给ValidationResult
覆盖方法的IsValid
:
[我举了你前question]
的例子public class CombinedMinLengthAttribute: ValidationAttribute
{
public CombinedMinLengthAttribute(int minLength, params string[] propertyNames)
{
this.PropertyNames = propertyNames;
this.MinLength = minLength;
}
public string[] PropertyNames { get; private set; }
public int MinLength { get; private set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var properties = this.PropertyNames.Select(validationContext.ObjectType.GetProperty);
var values = properties.Select(p => p.GetValue(validationContext.ObjectInstance, null)).OfType<string>();
var totalLength = values.Sum(x => x.Length) + Convert.ToString(value).Length;
if (totalLength < this.MinLength)
{
List<string> props = this.PropertyNames.ToList();
props.Add(validationContext.MemberName);
return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName), props);
}
return null;
}
}
答案 1 :(得分:0)
似乎ValidationResult.MemberNames
尚未针对MVC实施,请参阅this。
在某些情况下,您可能会想要使用第二个构造函数 ValidationResult的重载,它接受一个IEnumerable 会员名称。例如,您可能决定要显示 在比较两个字段上的错误消息,因此您将代码更改为 这样:
return new ValidationResult( FormatErrorMessage(validationContext.DisplayName), new[] { validationContext.MemberName, OtherProperty });
如果您运行代码,您将发现绝对没有区别。这是 因为虽然这种过载存在并且可能被使用 在.NET框架的其他地方,MVC框架完全忽略了 ValidationResult.MemberNames。