参数模型检验过滤器 .NetCore版
阅读原文时间:2023年07月09日阅读:1

最近学习 .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; }  
}