首页 新闻 会员 周边

.net core 模型验证问题

0
悬赏园豆:20 [已解决问题] 解决于 2019-06-12 17:22

是这样的,我有个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

问题补充:

目前的返回格式如图:

期望的返回格式如图:

顾星河的主页 顾星河 | 大侠五级 | 园豆:7173
提问于:2019-06-12 10:14

代码仓库无法访问

dudu 4年前

@dudu: 设置为公有权限了在,再访问试试

默卿 4年前

@默卿: 建议更多描述一下你想实现的效果

dudu 4年前

@dudu: 用图补充了一下,就是发生错误时,返回的JSON里有三个属性,code、msg、和data

默卿 4年前
< >
分享
最佳答案
0

通过 ModelState.IsValid 是可以实现的

收获园豆:20
dudu | 高人七级 |园豆:30994 | 2019-06-12 10:58

我想返回自定义的model,现在返回的是默认的

顾星河 | 园豆:7173 (大侠五级) | 2019-06-12 11:09

@默卿: 没看明白

dudu | 园豆:30994 (高人七级) | 2019-06-12 12:13

@dudu:
上面的文章刚看过了一下,我能明白其中的意思,我也在进行这方面的尝试,但是如下图所言,无论是action过滤器还是异常过滤器,断点都没有走到OnActionExecuting或者OnException方法里,这意味着,我无法设置context.Result的返回值,每次只能眼睁睁看着它返回默认的BadRequestObjectResult ,而不是自己的result。。。不是很清楚为啥别人的可以,我的不能,不知道是否和环境有关系,我用的是.net core 2.1

顾星河 | 园豆:7173 (大侠五级) | 2019-06-12 15:13

@dudu: 啊,终于解决了,参照那两篇文章改了一下代码,过滤器换成了结果过滤器,断点就能进去了,代码如图:

顾星河 | 园豆:7173 (大侠五级) | 2019-06-12 17:07

@dudu: 非常感谢,终于去了一块心病。对三种过滤器的使用,印象也更深刻了

顾星河 | 园豆:7173 (大侠五级) | 2019-06-12 17:10
其他回答(1)
0

一个前端路过

echo丶若梦 | 园豆:212 (菜鸟二级) | 2019-06-12 10:56

抓住,敲打,放生,三连击~

支持(0) 反对(0) 顾星河 | 园豆:7173 (大侠五级) | 2019-06-12 11:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册