• ASP.NET Core API 接收参数去掉烦人的 [FromBody]


    在测试ASP.NET Core API 项目的时候,发现后台接口参数为类型对象,对于PostMan和Ajax的Post方法传Json数据都获取不到相应的值,后来在类型参数前面加了一个[FromBody]属性才获取到。但是我看微软官方文档演示代码中并没有添加[FromBody],难道是微软官方文档写错了,按道理应该不会。Google里看到一片篇文章里的一个细节,又追回微软官方文档发现可行,于是记下去掉这个烦人的[FromBody]过程

    修改之前测试

    后台通过Visual Studio生成ASP.NET Core API项目之后,在Controller里添加如下代码

            // POST: api/Todo
            [HttpPost]
            public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem todoItem)
            {
                _context.TodoItems.Add(todoItem);
                await _context.SaveChangesAsync();
    
                return CreatedAtAction("GetTodoItem", new { id = todoItem.Id }, todoItem);
            }
    

    postMan调用

    如图所示,name的值为walk dog,后台api获取结果如第三张图所示:

    Jquery调用

    如图所示,前端会将页面填写的值进行序列化,但是后端依然获取不到值:

    返回结果

    不论是postMan调用还是ajax调用,后台都获取不到name值和isComplete的值

    增加[FromBody]

    测试如下:发现可以获取到相应的值,但是如果每个Post方法并含有类型参数的请求前面都添加这么一个属性,相比以前的Asp.Net Api 操作有点不习惯,甚至多余

    进行修改

    增加一个Contrller,命名为BaseController, 并继承Controller ,代码如下所示:

       public class BaseController: Controller
        {
        }
    

    然后在BaseController类上增加属性[ApiController],最终如下图所示:

    最后修改所有API控制器的父类,改为继承BaseController

    修改之后测试

    如图所示,此时可以看到已经没有[FromBody]了,需要注意一点是请求的ContentType必须为:application/json

    总结

    如果没有该[ApiController]属性,则需要显式定义绑定源属性。如果没有[ApiController]或其他绑定源属性[FromQuery],ASP.NET Core运行时会尝试使用复杂的对象模型绑定器。复杂对象模型绑定器从值提供程序(具有已定义的顺序)中提取数据。例如,'body model binder'总是选择加入。

  • 相关阅读:
    Ubuntu 上安装MySql
    Vue中组件的使用
    Swagger在 NETcore 中的使用
    awk 中 fieldwidths使用方法
    3.BIND从服务器及缓存服务器配置
    2.BIND服务基础及域主服务器配置
    1.DNS基础及域名系统架构
    Linux防火墙iptables的策略
    inode占用100%时硬盘无法写入文件故障处理
    特殊计算方式(数组)
  • 原文地址:https://www.cnblogs.com/zhan520g/p/10292903.html
Copyright © 2020-2023  润新知