[英]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);
}
有關更多詳細信息,請參見下面的討論。
StringLength
是一個ValidationAttribute
,它不接受Variable或Function作為構造函數參數。
如果要自定義StringLength
錯誤消息,可以按照以下步驟操作:
自定義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); } }
定義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; } }
Resigter ErrorProvider
services.AddSingleton<ErrorProvider>();
設置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(); }
InputModel
public class InputModel { [StringError(3, "Password")] public string Password { get; set; } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.