对于Model的检查,我们可以使用mvc自带的类库【using System.ComponentModel.DataAnnotations;】
但对于Query参数的检查,我们常常放在实现代码里,个人总觉得太多余。于是。。。。。。
1.定义特性:QueryRequiredAttribute
/// <summary>
/// 查询参数检查
/// </summary>
public class QueryRequiredAttribute : ActionFilterAttribute
{
public string paraNames, emptyTip;
/// <summary>
/// 查询参数检查(支持多参数),默认提示
/// </summary>
/// <param name="paraNames"></param>
public QueryRequiredAttribute(string paraNames)
{
Init(paraNames, null);
}
/// <summary>
/// 查询参数检查(支持多参数),自定义空值提示
/// </summary>
/// <param name="paraNames"></param>
/// <param name="emptyTip"></param>
public QueryRequiredAttribute(string paraNames, string emptyTip)
{
Init(paraNames, emptyTip);
}
/// <summary>
/// Action开始之前执行
/// </summary>
/// <param name="actionContext"></param>
public override void OnActionExecuting(ActionExecutingContext actionContext)
{
var queryParams = actionContext.HttpContext.Request.Query;
string msg = null;
string[] requiredParams = paraNames.Split(',');
foreach (var item in requiredParams)
{
if (!queryParams.ContainsKey(item) || string.IsNullOrWhiteSpace(queryParams[item]))
{
msg = $"value of {item} is required";
break;
}
}
if (!string.IsNullOrWhiteSpace(msg))
{
actionContext.Result = new JsonResult(
new
{
statusCode = 0,
message = emptyTip ?? msg,
});
}
base.OnActionExecuting(actionContext);
}
private void Init(string paraNames, string emptyTip)
{
this.paraNames = paraNames;
this.emptyTip = emptyTip;
}
}
2.给需要检查的Action方法加上检查特性
[HttpGet("GetList")]
[QueryRequired("id", "id不能为空")]
public ApiResult<List<Testdto>> GetList(string id)
{
return new BLL().GetList(id);
}
3.实现的效果测试
4.当然官方自带的也支持Query参数的检查;
查看官方源码发现:指定了特性可使用的范围
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class RequiredAttribute : ValidationAttribute
{
...
}
使用如下方式实现:
public void Method(
[Display(Name ="test"),Required(ErrorMessage ="{0}不能为空")]string testID)
{
return null;
}