如何在自定义验证属性中访问视图模型的属性值以更改消息

本文关键字:属性 消息 模型 访问 自定义 验证 视图 | 更新日期: 2023-09-27 18:31:54

视图模型有许多字符串属性,如下所示Sample。我的要求是根据视图模型中的布尔标志显示不同的验证消息。该标志是IsProposer属性,如下所述:

[SampleAttribute(true, "bla prop", "foo add driver")]       
public string Sample { get; set; }
public bool IsProposer { get; set; }
我想创建一个验证属性,

以便我可以将其放置在我的所有字符串属性上(必需的验证)。然后根据该布尔标志的值,我将相应地传递 msg。我的自定义验证属性如下所示:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = false)]
    public class SampleAttribute : RequiredAttribute
    {
        protected string ProposerErrorMessage { get; set; }
        protected string AdditionalDriverErrorMessage { get; set; }
        protected bool IsProposer { get; set; }
        public SampleAttribute(bool isProposer, string propmsg, string adddrivermsg)
        {
            ProposerErrorMessage = propmsg;
            IsProposer = isProposer;
            AdditionalDriverErrorMessage = adddrivermsg;
        }
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (IsValid(value))
            {
                return ValidationResult.Success;
            }
            else
            {
                return new ValidationResult(IsProposer ? ProposerErrorMessage : AdditionalDriverErrorMessage);
            }
        }
    }

现在的问题是,如您所见,我只是将 true 作为属性的第一个参数传递。在这里,我需要从视图模型实例传递 Isproposer 属性的值,以便我可以相应地采取行动。如何访问它?

如何在自定义验证属性中访问视图模型的属性值以更改消息

我通过创建这样的属性解决了我的问题:

 /// <summary>
    /// This validation attribute is an extension to RequiredAttribute that can be used to choose either of the two 
    /// validation messages depending on a property in the context of same model.
    /// </summary>
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = false)]
    public class RequiredExtensionAttribute : RequiredAttribute
    {
        private string _errorMessageIfTruthy;
        private string _errorMessageIfFalsy; 
        private string _dependentProperty;
        public RequiredExtensionAttribute(string dependentproperty, string errorMessageIfTruthy, string errorMessageIfFalsy)
        {
            _errorMessageIfTruthy = errorMessageIfTruthy;
            _dependentProperty = dependentproperty;
            _errorMessageIfFalsy = errorMessageIfFalsy;
        }
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var propertyTestedInfo = validationContext.ObjectType.GetProperty(this._dependentProperty);
            if (propertyTestedInfo == null)
            {
                return new ValidationResult(string.Format("unknown property {0}", this._dependentProperty));
            }
            var propertyTestedValue = propertyTestedInfo.GetValue(validationContext.ObjectInstance, null);
            if (IsValid(value))
            {
                return ValidationResult.Success;
            }
            else
            {
                return new ValidationResult((bool)propertyTestedValue ? _errorMessageIfTruthy : _errorMessageIfFalsy);
            }
        }
    }

现在可以在以下模型中使用:

[RequiredExtensionAttribute("IsProposerViewModel", "Please select your employment status.", "Please select this driver's employment status")]       
public string EmploymentStatus { get; set; }
public bool IsProposerViewModel { get; set; }

-其中属性的第一个参数是IsProposerViewModel,依赖值。