我想基于变量或函数设置字段的数据注释(显示):
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";
您如何将模型中的数据注释设置为变量或函数?
答案 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);
}
有关更多详细信息,请参见下面的讨论。
答案 2 :(得分:0)
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;
}
}
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; }
}