ASP.NET MVC:数据Annonations和验证摘要

时间:2013-04-19 11:46:34

标签: c# asp.net-mvc-3

我有一个带有几个属性的模型,我在上一个问题中实现了Darin的答案:ASP.NET MVC: Custom Validation by DataAnnotation。这使我能够一次验证4个属性(因为我需要它们一起不超过一定的长度)。

问题是,当我使用此自定义验证器仅对4个属性中的1个进行Annon时,只有该文本框的backgroundcolor在验证失败时才会变为红色。当我宣布所有4个属性时,所有4个文本框都将变为红色,但错误消息将显示4次。这很难看。所以我设置了@ Html.ValidationSummary(false),因此错误消息会在摘要中进行,但会汇总所有4条错误消息(这是合乎逻辑的)。

如何让所有4个文本框变为红色,以确保错误消息只显示一次?

提前感谢您帮助这个MVC菜鸟。欣赏它。

2 个答案:

答案 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的重载,它接受一个I​​Enumerable   会员名称。例如,您可能决定要显示   在比较两个字段上的错误消息,因此您将代码更改为   这样:

return new ValidationResult(
    FormatErrorMessage(validationContext.DisplayName), new[] { validationContext.MemberName, OtherProperty });
     

如果您运行代码,您将发现绝对没有区别。这是   因为虽然这种过载存在并且可能被使用   在.NET框架的其他地方,MVC框架完全忽略了   ValidationResult.MemberNames。