繁体   English   中英

使用IModelValidator创建自定义属性验证属性

[英]use IModelValidator to Create a Custom Property Validation Attribute

以下是我的课本中的自定义属性验证

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的构造函数中的第一个参数(成员名)必须为空“”,在什么情况下我们需要指定一个值

Q1: IModelValidator接口没有定义IsRequired属性,它来自何处以及如何使用此属性?

回答:在这种情况下,属性IsRequired是无用的,因为在您的代码中未使用它。

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

回答:实际上,它不必为空。 这取决于您要验证的级别。 注册自定义验证器后,您可以在Controller中调用它以验证模型。 因此,如果此验证器仅用于一个模型,则可以使用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>();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM