【问题标题】:Custom validation attribute's set error message not showing as predicted自定义验证属性的设置错误消息未按预期显示
【发布时间】:2017-09-19 01:58:04
【问题描述】:

我有一个自定义验证属性:

public class RequireIfPropertyIsFalseAttribute : ValidationAttribute
    {
        private string basisProperty { get; set; }
        public RequireIfPropertyIsFalseAttribute(string basisProperty)
        {
            this.basisProperty = basisProperty;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var basisProp = validationContext.ObjectType.GetProperty(basisProperty);
            var isFalse = !(bool)basisProp.GetValue(validationContext.ObjectInstance, null);

            if (isFalse)
            {
                if (value == null || (value.GetType() == typeof(string) && string.IsNullOrEmpty(((string)value).Trim())))
                        return new ValidationResult(this.ErrorMessage);
            }

            return ValidationResult.Success;
        }
    }

我将它用于两个模型属性:

public bool NoAgeProvided { get; set; }
[RequireIfPropertyIsFalse(nameof(NoAgeProvided), ErrorMessage = "This is required")]
[Display(Name = "Age")]
public int Age { get; set; }

public bool NoNameProvided { get; set; }
[RequireIfPropertyIsFalse(nameof(NoNameProvided), ErrorMessage = "This is required")]
[Display(Name = "Name")]
public string Name { get; set; }

验证后,名称验证消息会显示“这是必需的”。但是,对于 Age 属性,验证消息上会显示“The Age field is required”。我究竟做错了什么? 如何显示设置的ErrorMessage?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    因为属性 Age 是 typeof int,所以它始终是必需的(int 不能是 null),如果您将文本框留空,则会提交 null 值并执行必需的验证首先显示该错误消息。

    将您的属性更改为可为空

    public int? Age { get; set; }
    

    请注意,它适用于您的 Name 属性,因为它的 string 默认可以为空。

    附带说明,您应该考虑实现IClientValidatable,以便您也可以获得客户端验证。参考The Complete Guide To Validation In ASP.NET MVC 3 - Part 2

    【讨论】:

    • 我怀疑是这样的。但是,使字段可为空也意味着我必须更改关联的数据库表列的 is null 属性。我会阅读您提供的链接。非常感谢!
    • 您正在编辑数据,因此您始终使用视图模型,而不是视图中的数据模型。
    • 无论如何,如果没有提供,您希望在该 db 列中存储什么(0 的值没有意义)
    • 现在客户的要求很模糊,我有一个不可为空的表列和一个可以为空的模型属性。我希望我能找到一种方法来验证这两个领域的对比性质。未来的要求可能会发生变化,但现在我正在寻找解决方案。我仍在阅读您提供的链接,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多