簡體   English   中英

如何通過代碼設置數據注釋(以編程方式)

[英]How to set data annotation from code (programatically)

我想基於變量或函數設置字段的數據注釋(顯示):

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";

您如何將模型中的數據注釋設置為變量或函數?

您可以從StringLengthAttribute派生一個類(例如MyStringLenghtAttribute)並重寫IsValid。

您必須擴展DataAnnotationsModelValidatorProvider並重寫GetValidators方法。

DataAnnotationsModelValidatorProvider使用反射進行遍歷所有驗證屬性。

您可以訪問GetValidators方法中的所有屬性,並更改驗證屬性。

但是,您必須在應用程序啟動中注冊自定義DataAnnotationsModelValidatorProvider類,如下所示。

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

        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }

有關更多詳細信息,請參見下面的討論。

DataAnnotations動態附加屬性

StringLength是一個ValidationAttribute ,它不接受VariableFunction作為構造函數參數。

如果要自定義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. Resigter 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; } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM