netcore2 Web Api中自定义ModelState进行

2019-06-28  本文已影响0人  甘子的桃大哥

在接口开发中,通常会涉及到表单提交,以及表单的验证。

在视图模型中我们设置了表单验证

当提交表单时,如果这些字段不通过则会抛回错误400

这些错误使得前端比较难判断请求出错原因。

我们可以通过Filter 知识点连接  https://www.cnblogs.com/snaildev/p/9154669.html

来处理MVC的ModelState 知识点连接 https://www.cnblogs.com/hohoa/p/5839993.html

下面我们开始自定义一个ModelState 处理

首先定义错误信息返回模型

/// <summary>

    /// 验证错误信息视图模型

    /// </summary>

    public class ErrorViewModel {

        /// <summary>

        /// 错误字段

        /// </summary>

        public string ErrorName { get; set; }

        /// <summary>

        /// 错误内容ErrorMessage

        /// </summary>

        public string Error { get; set; }

    }

接下来我们自定义一个错误处理

/// <summary>

    /// 请求验证错误处理

    /// </summary>

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true)]

    public class RequiredError : ResultFilterAttribute

    {

        public override void OnResultExecuting(ResultExecutingContext actionContext)

        {

            //base.OnResultExecuting(actionContext);

            var modelState = actionContext.ModelState;

            List<ErrorViewModel> Errors = new List<ErrorViewModel>();

            if (!modelState.IsValid)

            {

                PagedList<ErrorViewModel> errorList = new PagedList<ErrorViewModel>();

                BaseResult baseResult = new BaseResult();

                    foreach (var key in modelState.Keys)

                    {

                        var state = modelState[key];

                        if (state.Errors.Any())

                        {

                            ErrorViewModel errorView = new ErrorViewModel();

                        errorView.ErrorName = key.ToString();

                            errorView.Error = state.Errors.First().ErrorMessage;

                            Errors.Add(errorView);

                        }

                    }

                errorList.Items = Errors;

                baseResult = new BaseResult()

                    {

                        code = ResultCodeAddMsgKeys.CommonObjectFailCode,

                        msg = "请求验证失败",

                        data = errorList

                    };

                actionContext.Result  = new ContentResult

                {

                    Content = JsonConvert.SerializeObject(baseResult),

                    ContentType = "application/json"

                };

            }

        }

    }

这样已经定义完了。接下来我们去使用,到控制器里添加自定义错误验证的注解

修改表单视图模型,增加以下错误验证提示方便前端阅读

好了,我们再请求试一下。

这样表单验证错误就会按照我们得需求格式返回了。不会直接返回400,而是根据业务返回错误码。

代码也许不够好,可以指出。仅供初学者参考,大神可以指导,请不要太过严厉批评~~~~~~~~~~~

上一篇下一篇

猜你喜欢

热点阅读