1.模型验证类库:DataAnnotations,我们使用常用基本的模型验证类库
2.定义验证的时候如下:
//ErrorMessage 不再返回具体的提示信息,只返回具体的对应的code
public class RequestDTO
{
/// <summary>
/// 用户ID
/// </summary>
[Required(ErrorMessage = "MsgCode_UserIDisNull")]
public string UserID{ get; set; }
/// <summary>
/// 订单ID
/// </summary>
[Required(ErrorMessage = "MsgCode_OrderIDisNull")]
public string OrderID{ get; set; }
}
3.实现两种方式:
a.返回前端,让前端根据MsgCode去匹配对应多语言提示语。
b.后端使用过滤器处理,直接返回对应的多语言提示语
4.前端比较方便,但需要去查询对应的库,而且会有展示延迟,此处只测试后端解决
4.1定义处理过滤器:
public class ModelValidateActionFilter : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
throw new NotImplementedException();
}
public void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
//获取验证失败的模型字段ErrorCode
var errorCodeList = context.ModelState.Select(e => e.Value.Errors.First().ErrorMessage).ToList();
//开始全球化翻译
var errorMsgList = new List<string>();
errorCodeList.ForEach(item => { errorMsgList.Add(I18Helper.Instance[item]); });//去查询MsgCode对应的国际化信息
//设置返回内容
var str = string.Join("|", errorMsgList);
var result = new
{
Code = 400,
Msg = str,
}
context.Result = new BadRequestObjectResult(result);
}
}
}
4.2添加过滤器到http中间件中
//关闭系统自带的模型验证过滤器
services.Configure<ApiBehaviorOptions>(opt => opt.SuppressModelStateInvalidFilter = true);
services.AddControllers(opt =>
{
//启用自己的模型验证过滤器
opt.Filters.Add(typeof(ModelValidateActionFilter));
});
5.测试
{
"code": 400,
"msg": "用户ID不能为空|订单ID不能为空"
}