有没有办法从ModelState字典中获取验证规则,例如
在我的模型中,我有以下数据注释属性。
[StringLength(64, MinimumLength = 8, ErrorMessage = "{0} must be between {2} to {1} characters")]
public string Password { get; set; }
因此,在验证 Modelstate
能否 MinimumLength
和 MaximumLenght
?
我想发送这两个值作为响应,这样前端就可以使用这些值生成本地化消息。
我的响应示例如下
{
"errorCode" : 1234,
"message": : "Password must be between 8 to 64 characters",
"args" : ["8","64"]
}
因此,使用这个错误代码,前端可以使用以下方法生成本地化消息 args
.
即使我们在模型中添加了 ConfigureApiBehaviorOptions
该对象不包含验证规则,我建议最简单的方法是在你的字符串里面做一个json对象,像这样你就可以直接使用你想要的格式。
[StringLength(64, MinimumLength = 8, ErrorMessage = "{{error:'{0} must be between {2} to {1} characters ',args:'[{1},{2}]' }}") ]
您可以使用 Reflection
来达到你的要求,正如 @Józef Podlecki 所说。
你也可以参考 这个.
这里有一个通用的方法来实现。
public class PerInfo
{
[StringLength(64, MinimumLength = 8, ErrorMessage = "{0} must be between {2} to {1} characters")]
public string Password { get; set; }
}
根据你提供的响应格式,你可以创建一个错误模型。
public class CusError
{
public long errorCode { get; set; }
public string message { get; set; }
public string[] args { get; set; }
}
代码:
[HttpPost]
public IActionResult Validate(PerInfo perInfo)
{
if (!ModelState.IsValid)
{
var error = GenerateValidationModel<PerInfo>();
return BadRequest(error);
}
return Ok();
}
private CusError GenerateValidationModel<T>()
{
var error = new CusError();
foreach (var prop in typeof(T).GetProperties())
{
object[] attrs = prop.GetCustomAttributes(true);
if (attrs == null || attrs.Length == 0)
continue;
foreach (Attribute attr in attrs)
{
if (attr is StringLengthAttribute)
{
error.errorCode = 1234;
error.message = string.Format((attr as StringLengthAttribute).ErrorMessage, prop.Name, (attr as StringLengthAttribute).MaximumLength.ToString(), (attr as StringLengthAttribute).MinimumLength.ToString());
error.args = new string[] { (attr as StringLengthAttribute).MinimumLength.ToString(), (attr as StringLengthAttribute).MaximumLength.ToString() };
}
}
}
return error;
}
这里是邮递员的测试结果
那么在验证Modelstate的时候,我们可以得到MinimumLength和MaximumLenght吗?
你可以从模型类型中获取属性值,用 反思.
var type = ViewModel.GetType()
var properties = type.GetProperties();
foreach (var property in properties)
{
var attributes = property.GetCustomAttributes(true);
foreach (object attribute in attributes)
{
var stringLengthAttribute = attribute as StringLengthAttribute;
if (stringLengthAttribute == null)
{
continue;
}
var maximumLength = stringLengthAttribute.MaximumLength;
var minimumLength = stringLengthAttribute.MinimumLength;
}
}