【问题标题】:ASP.NET MVC: Data Annonations and Validation SummaryASP.NET MVC:数据注释和验证总结
【发布时间】:2013-04-19 11:46:33
【问题描述】:

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

问题是,当我使用此自定义验证器仅 Annonate 4 个属性中的 1 个时,验证失败时只有该文本框的背景颜色会变为红色。当我 annonate 所有 4 个属性时,所有 4 个文本框都会变成红色,但错误消息将显示 4 次。这是丑陋的。所以我设置了@Html.ValidationSummary(false),所以错误信息会出现在摘要中,但所有4条错误信息都会被汇总(这是合乎逻辑的)。

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

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

【问题讨论】:

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


    【解决方案1】:

    我尚未测试,但我认为解决方案可能是将“成员”列表传递给 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 个属性上使用 Data Annonation,我只会看到一次错误消息(还有 1 个红色文本框,这是问题所在),如果我对所有 4 个属性进行标注,我会看到 4 次错误消息(这也是不想要的)。所以基本上没有变化。结果相同。
    • 我修复了代码。而且我也测试过,它不适用于“MVC”(请参阅​​我的其他答案)
    【解决方案2】:

    似乎ValidationResult.MemberNames 还没有实现MVC,见this

    在某些情况下,您可能会想使用第二个构造函数 接受 IEnumerable 的 ValidationResult 的重载 成员名称。例如,您可能决定要显示 正在比较的两个字段上的错误消息,因此您将代码更改为 这个:

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

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

    【讨论】:

    • this answer 说它可以工作..
    • 在那个答案中,他们在模型上使用 IValidatableObject msdn.microsoft.com/fr-fr/library/…,这与实现自定义 ValidationAttribute msdn.microsoft.com/fr-fr/library/… 不同
    • 感谢您的研究。所以,还没有解决办法。我要走另一条路,所以我的现实世界问题得到了解决。但是看看这是否可以在 MVC 中完成可能会很有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2011-08-31
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多