如何从代码中设置数据注释(以编程方式)

时间:2018-08-05 13:28:08

标签: c# .net data-annotations

我想基于变量或函数设置字段的数据注释(显示):

public class InputModel
{            
    [Required]
    [StringLength(100, ErrorMessage = VARIABLE or FUNCTION())]
    [Display(Name = "Password - must use at least 12 characters")]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

如何通过编程方式设置数据注释?

InputModel.DataAnnotation.Display = "Foo";

您如何将模型中的数据注释设置为变量或函数?

3 个答案:

答案 0 :(得分:0)

您可以从StringLengthAttribute派生一个类(例如MyStringLenghtAttribute)并覆盖IsValid。

答案 1 :(得分:0)

您必须扩展DataAnnotationsModelValidatorProvider并重写GetValidators方法。

DataAnnotationsModelValidatorProvider使用反射进行遍历所有验证属性。

您可以访问GetValidators方法中的所有属性,并更改验证属性。

但是,您必须在应用程序启动中注册自定义DataAnnotationsModelValidatorProvider类,如下所示。

protected void Application_Start()
    {
        ModelValidatorProviders.Providers.Add(new CustomMetadataValidationProvider());

        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }

有关更多详细信息,请参见下面的讨论。

DataAnnotations dynamically attaching attributes

答案 2 :(得分:0)

StringLengthValidationAttribute,它不接受 Variable Function 作为构造函数参数。

如果您要自定义StringLength错误消息,可以按照以下步骤操作:

  1. 自定义ValidationAttribute

     public class StringError : StringLengthAttribute
     {
    private ErrorProvider _error;
    private string _key;
    public StringError(int maxlength, string key):base(maxlength)
    {
        _key = key;
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        _error = (ErrorProvider)validationContext.GetService(typeof(ErrorProvider));
    
        return base.IsValid(value, validationContext);
    }
    public override string FormatErrorMessage(string name)
    {
        if (_error != null)
        {
            return _error.Error(_key);
        }
        return base.FormatErrorMessage(name);   
    }
    }
    
  2. 定义ErrorProvider进行设置并获取ErrorMessage

        public class ErrorProvider
        {
    private Dictionary<string, string> _errorDic = new Dictionary<string, string>();
    
    public void AddOrUpdateError(string key, string value)
    {
        _errorDic[key] = value;
        //_errorDic.TryAdd(key,value);
    }
    public string Error(string key)
    {
        string value = null;
        _errorDic.TryGetValue(key, out value);
        return value;
    }
    }
    
  3. ErrorProvider

        services.AddSingleton<ErrorProvider>();
    
  4. 设置ErrorMessage

        [HttpPost("SetKey")]
    public IActionResult SetKey([FromForm]string key,[FromForm]string value)
    {
        _errorProvider.AddOrUpdateError(key, value);
        return Ok();
    }
    [HttpPost("CustomAttribute")]
    public IActionResult CustomAttribute(InputModel input)
    {
        return Ok();
    }
    
    1. InputModel

         public class InputModel
        {
           [StringError(3, "Password")]
           public string Password { get; set; }
      
         }