代码类:
public class ValidateParamsAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var parameters = actionContext.ActionDescriptor.GetParameters();
actionContext.ModelState.Clear();
foreach (var parameter in parameters)
{
if (parameter.GetCustomAttributes<RequiredAttribute>().Any())
{
object value = null;
var valueProviderResult = actionContext.ActionArguments.TryGetValue(parameter.ParameterName, out value);
if (!valueProviderResult || value == null || value.ToString().Trim().Length == 0)
{
var errorMessage = GetRequiredErrorMessage(parameter);
actionContext.ModelState.AddModelError(parameter.ParameterName, errorMessage);
}
}
}
if (!actionContext.ModelState.IsValid)
{
// 构造返回的 ApiResponse 对象
var errors = actionContext.ModelState.ToDictionary(
kvp => kvp.Key,
e => e.Value.Errors.FirstOrDefault()?.ErrorMessage
);
// 构造返回的 ApiResponse 对象
var response = new Result<object>
{
StatusCode = 400,
ErrCode = -1,
Msg = "参数校验失败",
Data = errors
};
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, response);
}
}
private string GetRequiredErrorMessage(HttpParameterDescriptor parameter)
{
var requiredAttribute = parameter.GetCustomAttributes<RequiredAttribute>().FirstOrDefault() as RequiredAttribute;
if (requiredAttribute != null && !string.IsNullOrEmpty(requiredAttribute.ErrorMessage))
{
return requiredAttribute.ErrorMessage;
}
return $"{parameter.ParameterName}参数不能为空";
}
}
public class Result<T>
{
public int StatusCode { get; set; }
public int ErrCode { get; set; }
public string Msg { get; set; }
public T Data { get; set; }
}
使用方法:
[Route("api/GetInfo")] //接口地址
[HttpGet]
[ValidateParams]
public AjaxResult GetHealth([Required]string A = "", [Required]string B= "", [Required] int C= -1)
说明:在需要参数校验的接口处添加[ValidateParams]注解,然后在需要校验的参数前添加必传[Required]注解。
结果:
{
"StatusCode": 400,
"ErrCode": -1,
"Msg": "参数校验失败",
"Data": {
"C": "C参数不能为空"
}
}