最近学习 .NETCore3.1,发现过滤器的命名空间有变化。
除此以外一些方法的名称和使用方式也有变动,正好重写一下。
原先:System.Web.Http.Filters;
现在:Microsoft.AspNetCore.Mvc.Filters;
注意:本 Demo 只是个人学习测试
在基类控制器上添加[ParaModelValidate]特性:
(.NetCore3中没有JsonResult,从使用习惯出发,使用自己写的JsonContentResultBuilder返回JSON格式的ContentResult)
/// <summary>
/// 基类控制器
/// </summary>
\[ParaModelValidate\]
\[ErrorCatch\]
public class BaseController : ControllerBase
{
public ContentResult JsonResult(dynamic data = null)
{
ContentResult result = JsonContentResultBuilder.BuildViewJsonResult(data);
return result;
}
}
基类控制器
public class DemoController : BaseController
{
public ActionResult Login(DemoParaModel paraModel)
{
List<int> ss = new List<int>() { 1, 2, 3, 4, 5 };
return JsonResult(ss);
}
}
DemoController
/// <summary>
/// 参数模型检验过滤器 NetCore版
/// </summary>
public class ParaModelValidateAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//本方法的所有参数描述符
IList<ParameterDescriptor> actionParameters = filterContext.ActionDescriptor.Parameters;
//只有这个方法需要参数的时候才进行校验
if (actionParameters.Count != 0)
{
dynamic paraModel = filterContext.ActionArguments.FirstOrDefault().Value;
ParaModelValidateHelper.Validate(paraModel);
}
}
}
public static class ParaModelValidateHelper
{
/// <summary>
/// 参数模型校验
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static void Validate<T>(T entity) where T : class
{
Type type = entity.GetType();
PropertyInfo\[\] properties = type.GetProperties();
//循环模型的所有参数
foreach (var item in properties)
{
//校验必填参数
if (item.IsDefined(typeof(RequiredAttribute), true))//判断该参数是否有Required特性
{
var value = item.GetValue(entity);//获取值
if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
{
throw new Exception(string.Format("缺少必填参数{0}", item.Name));
}
}
//增加其他类型的校验的话接着加else if,如果常用校验很多可以改为switch
//System.ComponentModel.DataAnnotations
}
}
}
public class DemoParaModel
{
/// <summary>
/// 必填参数
/// </summary>
\[Required\]
public string ID { get; set; }
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章