【问题标题】:use IModelValidator to Create a Custom Property Validation Attribute使用 IModelValidator 创建自定义属性验证属性
【发布时间】:2019-08-21 02:38:07
【问题描述】:

下面是我教科书中的自定义属性验证

public class MustBeTrueAttribute : Attribute, IModelValidator
{
    public bool IsRequired => true;

    public string ErrorMessage { get; set; }

    public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
    {
        bool? value = context.Model as bool?;
        if (!value.HasValue || value.Value == false)
        {
            return new List<ModelValidationResult> {
                    new ModelValidationResult("", ErrorMessage) // why first argument has to be empty?
                };
        }
        else
        {
            return Enumerable.Empty<ModelValidationResult>();
        }
    }
}

public class Appointment
{  
    public DateTime Date { get; set; }

    [MustBeTrue(ErrorMessage = "You must accept the terms")]
    public bool TermsAccepted { get; set; }
}

我有两个问题:

Q1-IModelValidator 接口没有定义IsRequired 属性,它来自哪里以及如何使用这个属性?

Q2-为什么ModelValidationResult的构造函数中的第一个参数(memberName)必须为空“”,什么情况下需要指定一个值

【问题讨论】:

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


    【解决方案1】:

    Q1:IModelValidator 接口没有定义IsRequired 属性,它来自哪里以及如何使用这个属性?

    Ans:在这种情况下,IsRequired 属性没有用,因为它没有在您的代码中使用。

    Q2:为什么ModelValidationResult的构造函数中的第一个参数(memberName)必须为空“”,什么情况下需要指定值

    Ans: 实际上,它不一定是空的。这取决于您要验证的级别。一旦你注册了你的自定义验证器,你可以在你的控制器中调用它来验证你的模型。因此,如果此验证器仅适用于一个模型,您可以使用 Switch...Case 语句验证所有属性,并为这些属性指定特定名称。另一方面,如果这个验证器将用于验证许多不同的模型。您可能需要考虑是否适合指定一个值。

    public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
    {
        if (context != null)
        {
            switch (context.ModelMetadata.PropertyName)
            {
                case "TermsAccepted":
                    if (!context.Model.TermsAccepted) {
                        return new ModelValidationResult[]
                        {
                            new ModelValidationResult 
                            {
                                MemberName = "TermsAccepted",
                                Message = "You must accept the terms"
                            }
                        };
                    }
                    break; 
                default:
            }
            return new List<ModelValidationResult> 
            {
                new ModelValidationResult("", ErrorMessage)
            };
        }
    
        return Enumerable.Empty<ModelValidationResult>();
    }
    

    【讨论】:

    • 对于第二季度,我的情况相同,但即使我将其命名为 MemberName = "TermsAccepted",验证也不会显示。所以MemberName必须是空的,为什么
    • 你能告诉我你是如何验证你的模型的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多