是这样的,我有个post接口,参数是个model对象,要验证对象里面的属性非空,由于不想一个一个写if-else,所以用了模型验证,就是在model里给属性标上Required特性,控制器里只需根据ModelState.IsValid就能判断出是否有属性的值为空了。
问题也就来了,action在返回错误时,没有返回我想要的错误输出,开始我是这样的写的:
if (!ModelState.IsValid)
{
return "参数请求错误!!";
}
我发现这样没用时,在网上Get了一番,发现自定义返回结果是需要重写OnActionExecuting方法的,于是我参照网上用法,定义了一个XcActionFilter类,继承ActionFilterAttribute,重写了一下OnActionExecuting,在这个里面new了一个我自定义的model作为返回结果。
最后在Startup.cs里,我注入了XcActionFilter这个类使之生效。
------------------------------------------------------------------------------------------------------
然而,api还是给我返回了默认的输出,如:
{
"name": [
"name不得为空"
]
}
并没有返回我制定的输出格式。
经调试,我发现的问题是,参数输入不为空时,能进入我自定义的过滤器XcActionFilter,参数为空时,断点压根儿就没进去,所以很费劲问题出在哪里。
这个是我的demo地址,默认打开的是swagger接口调试页面,方便测试,代码直接能运行:
https://gitee.com/tccwpl/ModelFilter/tree/master/ModelFilter
希望做过这方面的园友可以帮我找找问题,不胜感激。
我写这个demo主要是参考这个博客弄的:
https://www.cnblogs.com/stulzq/p/8962018.html
目前的返回格式如图:
期望的返回格式如图:
通过 ModelState.IsValid
是可以实现的
我想返回自定义的model,现在返回的是默认的
@默卿: 没看明白
@dudu:
上面的文章刚看过了一下,我能明白其中的意思,我也在进行这方面的尝试,但是如下图所言,无论是action过滤器还是异常过滤器,断点都没有走到OnActionExecuting或者OnException方法里,这意味着,我无法设置context.Result的返回值,每次只能眼睁睁看着它返回默认的BadRequestObjectResult ,而不是自己的result。。。不是很清楚为啥别人的可以,我的不能,不知道是否和环境有关系,我用的是.net core 2.1
@dudu: 啊,终于解决了,参照那两篇文章改了一下代码,过滤器换成了结果过滤器,断点就能进去了,代码如图:
@dudu: 非常感谢,终于去了一块心病。对三种过滤器的使用,印象也更深刻了
一个前端路过
抓住,敲打,放生,三连击~
代码仓库无法访问
– dudu 5年前@dudu: 设置为公有权限了在,再访问试试
– 默卿 5年前@默卿: 建议更多描述一下你想实现的效果
– dudu 5年前@dudu: 用图补充了一下,就是发生错误时,返回的JSON里有三个属性,code、msg、和data
– 默卿 5年前