如何将 json POST 数据作为对象传递给 Web API 方法?

2024-01-23

ASP.NET MVC4 Web API 应用程序定义了 post 方法来保存客户。 客户在 POST 请求正文中以 json 格式传递。 post 方法中的客户参数包含属性的空值。

如何解决此问题以便发布的数据将作为客户对象传递?

如果可能的话,应该使用Content-Type: application/x-www-form-urlencoded,因为我不知道如何在发布表单的javascript方法中更改它。

控制器:

public class CustomersController : ApiController {

  public object Post([FromBody] Customer customer)
        {
            return Request.CreateResponse(HttpStatusCode.OK,
            new
            {
                customer = customer
            });
        }
    }
}

public class Customer
    {
        public string company_name { get; set; }
        public string contact_name { get; set; }
     }

Request:

POST http://localhost:52216/api/customers HTTP/1.1
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

{"contact_name":"sdfsd","company_name":"ssssd"}

EDIT: 2017 年 10 月 31 日

相同的代码/方法适用于Asp.Net核心2.0以及。主要区别在于,在 asp.net core 中,Web api 控制器和 Mvc 控制器都合并到单个控制器模型中。所以你的返回类型可能是IActionResult或其实现之一(例如:OkObjectResult)


Use

contentType:"application/json"

你需要使用JSON.stringify发送时将其转换为 JSON 字符串的方法,

模型绑定器会将 json 数据绑定到您的类对象。

下面的代码可以正常工作(已测试)

$(function () {
    var customer = {contact_name :"Scott",company_name:"HP"};
    $.ajax({
        type: "POST",
        data :JSON.stringify(customer),
        url: "api/Customer",
        contentType: "application/json"
    });
});

Result

contentType属性告诉服务器我们正在以 JSON 格式发送数据。由于我们发送了 JSON 数据结构,模型绑定将会正确发生。

如果您检查 ajax 请求的标头,您可以看到Content-Type值设置为application/json.

如果您没有显式指定 contentType,它将使用默认的内容类型application/x-www-form-urlencoded;


2015 年 11 月编辑以解决评论中提出的其他可能问题

发布一个复杂的对象

假设您有一个复杂的视图模型类作为您的 Web api 操作方法参数,如下所示

public class CreateUserViewModel
{
   public int Id {set;get;}
   public string Name {set;get;}  
   public List<TagViewModel> Tags {set;get;}
}
public class TagViewModel
{
  public int Id {set;get;}
  public string Code {set;get;}
}

你的 web api 端点就像

public class ProductController : Controller
{
    [HttpPost]
    public CreateUserViewModel Save([FromBody] CreateUserViewModel m)
    {
        // I am just returning the posted model as it is. 
        // You may do other stuff and return different response.
        // Ex : missileService.LaunchMissile(m);
        return m;
    }
}

在撰写本文时,ASP.NET MVC 6 是最新的稳定版本,在 MVC6 中,Web api 控制器和 MVC 控制器都继承自Microsoft.AspNet.Mvc.Controller基类。

要将数据从客户端发送到方法,下面的代码应该可以正常工作

//Build an object which matches the structure of our view model class
var model = {
    Name: "Shyju",
    Id: 123,
    Tags: [{ Id: 12, Code: "C" }, { Id: 33, Code: "Swift" }]
};

$.ajax({
    type: "POST",
    data: JSON.stringify(model),
    url: "../product/save",
    contentType: "application/json"
}).done(function(res) {       
    console.log('res', res);
    // Do something with the result :)
});

模型绑定适用于某些属性,但不是全部!为什么 ?

如果你不使用修饰web api方法参数[FromBody]属性

[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
    return m;
}

并发送模型(原始 javascript 对象,不是 JSON 格式)而不指定 contentType 属性值

$.ajax({
    type: "POST",
    data: model,
    url: "../product/save"
}).done(function (res) {
     console.log('res', res);
});

模型绑定适用于模型上的平面属性,不适用于类型为复杂/其他类型的属性。在我们的例子中,Id and Name属性将正确绑定到参数m, 但是Tags属性将是一个空列表。

如果您使用短版本也会出现同样的问题,$.post发送请求时将使用默认的 Content-Type。

$.post("../product/save", model, function (res) {
    //res contains the markup returned by the partial view
    console.log('res', res);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 json POST 数据作为对象传递给 Web API 方法? 的相关文章

  • 在 MongoDB 中查找具有字符串 ID 数组的文档

    我有一个 id 字符串数组 我想将其与 find 函数一起使用 db companies find id in arr arr看起来像这样 563a2c60b511b7ff2c61e938 563a2c60b511b7ff2c61e8b7
  • ASP.NET MVC3 应用程序可以在不更改特定代码的情况下托管在云中吗?

    我使用以下方法创建了一个 ASP NET Web 应用程序 ASP NET MVC 3 网络表单 Linq 到 SQL MS SQL Server 数据库 WCF 需要做什么才能将其托管在云服务上 我是否应该将其转换为 Azure 应用程序
  • 从 x,y 屏幕空间坐标查找 2D 等距网格上的列、行(将方程转换为函数)

    我试图在屏幕空间点 x y 的二维等距网格中找到行 列 现在我几乎知道我需要做什么 即找到上图中红色向量的长度 然后将其与表示网格边界的向量的长度 由黑色向量表示 进行比较 现在我在数学堆栈交换中寻求帮助 以获得用于计算点 x y 与黑色边
  • 使用 Javascript 在 Imacros 中循环

    我如何使用 javascript 循环 imm imacros 脚本 我搜索了一下 发现了这个 for i 0 i lt n i iimPlay marconame iim 但当我使用它时 我的浏览器 Firefox 18 挂起 for i
  • 计算Javascript中两次点击之间的时间

    我想用 javascript 计算属性的两次点击之间的时间 但我不知道如何 例如 a href click here a 如果用户单击多次 假设 5 秒内 我想显示警报 如果有帮助的话我正在使用 jQuery 我对 javascript 不
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • 未捕获的引用错误:myFunction 未定义[重复]

    这个问题在这里已经有答案了 这到底是怎么回事 http jsfiddle net sVT54 http jsfiddle net sVT54
  • 将音频与视频流合并 Node.js

    我正在创建 YouTube 视频下载器并且正在使用ytdl core库 它无法下载带有音频的高质量视频 因为 youtube 将其放在另一个文件中 但我需要将其全部下载到一个文件中 我已经这样做了 app get download asyn
  • iframe 重新加载按钮

    我浏览了很多网站 但似乎没有一个能正常工作 或者我不明白它们 我想要一个刷新某个 iframe 的简单按钮 该按钮将位于父页面上 并且 iframe 名称为 Right 有很多方法可以做到这一点 假设这个iframe markup 我们可以
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • 如何滚动到div内的元素?

    我有一个滚动的div我想在点击它时发生一个事件 它会强制执行此操作div滚动以查看内部元素 我写的JavasCript是这样的 document getElementById chr scrollIntoView true 但这会在滚动时滚
  • Flux + React.js - 操作中的回调是好还是坏?

    让我解释一下我最近遇到的问题 我有 React js Flux 驱动的应用程序 有一个列表显示文章数量 注意 应用程序中有多个不同的列表 和文章详情查看在里面 但每个列表只有一个 API 端点 它返回文章数组 为了显示我需要的详细信息fin
  • WebRTC:通道、轨道和流与 RTP SSRC 和 RTP 会话之间的关系

    来自 Mozilla 网站 https developer mozilla org en US docs Web API Media Streams API https developer mozilla org en US docs We
  • window.showModalDialog 的等效跨浏览器解决方案是什么?

    window showModalDialog 的等效跨浏览器解决方案有哪些 showModalDialog 在 IE 和 FF 3 中引入 我个人认为没有 但是有很多 UI 工具包提供了这样的功能 例如jQuery UI http jque
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • Jquery:选择菜单以显示和隐藏某些div元素

    我正在创建一个选择菜单 根据所选选项显示和隐藏某些 div 像这样的东西
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e
  • 运行测试项目时自动启动ASP.MVC项目

    我正在尝试为我的 ASP 网站设置一个测试项目 对于某些测试 我想使用 selenium 来执行端到端测试 因此 我的网站必须运行 以便测试可以访问该网站 运行测试时如何启动我的网站项目 请参考以下链接 我相信这是可能的 但会有点棘手 这些
  • 如何在 SVG 元素上使用箭头标记?

    我需要在 d3 js 中创建一个箭头 但我找到的只是带有节点图的示例 我需要的是简单地制作一个从 A 点到 B 点的箭头 我尝试实现以下示例中的部分代码 http bl ocks org 1153292 http bl ocks org 1
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o

随机推荐

  • VSCode 在启动时打开特定文件

    目前是否可以在 VSCode 中设置启动时打开的特定文件 我安装了 待办任务 扩展 并且我想在每次加载 VSCode 时默认打开我的 TODO 文件 使用版本1 12 1 编辑 我认为最好的方法是使用可以在启动时运行命令的扩展 例子是 自动
  • 无法批量分配受保护的属性

    更新代码格式以便更好地查看 Folks 我已经研究这个有一段时间了 但我不明白这里可能出了什么问题 我正在使用设计 class User lt ActiveRecord Base has many addresses accepts nes
  • 如何在 Coq 简化过程中应用一次函数?

    据我了解 Coq 中的函数调用是不透明的 有时 我需要使用unfold应用它然后fold将函数定义 主体恢复为其名称 这通常很乏味 我的问题是 是否有更简单的方法来应用函数调用的特定实例 作为一个最小的例子 对于一个列表l 证明右附加 没有
  • 如何显示 MySQL 上最近执行的查询?

    是否有任何查询 方式来显示最后执行的查询ALL服务器 对于那些拥有 MySQL gt 5 1 12 的用户 您可以在运行时全局控制此选项 Execute SET GLOBAL log output TABLE Execute SET GLO
  • iOS Safari:100% 宽度固定位置标题比视口宽

    我遇到了一个特别影响 iOS 上 Safari 的问题 我正在构建一个页面 该页面具有固定位置标题 即视口的宽度 页面的内容是一系列图像 数量可变 应向右滚动 当用户滚动时 标题应保持在原位 在 iOS Safari 上 固定标题比视口稍大
  • ValueError:没有为 Tensorflow 中的任何变量提供梯度

    我正在尝试在 Tensorflow 中创建一个 dice loss 函数 我遇到了张量流的麻烦 执行以下代码 import tensorflow as tf import tensorlayer as tl def conv3d x inC
  • 为什么VIM会高亮某些单词?

    我注意到 使用不同的颜色方案 VIM 会下划线 突出显示某些单词 这是为什么以及如何将其关闭 与另一种配色方案 我在用着spf13 vim 配置 https github com spf13 spf13 vim并使用 Putty 进行远程连
  • 如何使用gradle将apk发布到Maven Central?

    我用 android studio 创建了一个 android 项目 它会生成一些apk 如何使用 gradle 将 apk 发布到 Maven Central 我可以在 apk 的工件中写什么 apply plugin maven app
  • 为什么 .NET 多行正则表达式中的 $ 不匹配 CRLF?

    我注意到以下几点 var b1 Regex IsMatch Line1 nLine2 Line1 RegexOptions Multiline true var b2 Regex IsMatch Line1 r nLine2 Line1 R
  • 为什么当函数末尾缺少 return 语句时它会起作用? [复制]

    这个问题在这里已经有答案了 我正在学习C 下面的代码让我困惑 int test return int a for int i 40 i lt 44 i if i a cout lt lt return here with i lt lt i
  • scala 方法定义接受不同数字类型列表的函数

    我有以下问题 我有一个函数 它接受 List Double 作为参数 对列表的元素执行一些算术运算 然后返回结果 我希望该函数也接受 List Int 这是一个例子 def f l List Double var s 0 0 for i l
  • 使用 getElementsByTagName() 更改所有元素的样式

    我对 javascript 相当陌生 无法让这段代码正常工作 我不确定我错过了什么 这就是我想要它做的事情 我试图让脚本读取所有内容并切换正文中找到的跨度的可见性 span A span span X span span B span sp
  • 如何在 ios 7 中锁定纵向方向以仅查看

    我已经为 Iphone 和 Ipad 创建了一个应用程序 它由两个带有导航控制器的主视图组成 导航控制器被插入到 tabBar 控制器中 我想将主视图锁定为纵向方向 并且只有导航控制器的子视图触发可能的方向为 Partrait 和横向 是否
  • React 原生路由与 React 导航 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我要选择是否使用反应导航 https reactnavigation org或使用反应本机路由器 https reacttraining com
  • 华为登录失败,状态码28

    即使我使用了上一个sdk 华为签名也失败 状态码为28 是什么原因导致此错误 错误6003表明该故障是由于签名证书指纹不正确引起的 你可以 确保应用的证书签名与AppGallery Connect中配置的一致 打开应用程序的APK文件 从其
  • 如何在詹金斯工作流程中下载受保护的资源?

    很多时候 我需要从受用户名 密码保护的远程存储库 例如 maven repo 下载文件 例如档案 很容易获得这样的文件curl or wget 但是当我不喜欢在日志上看到密码时 也许有更好 嵌入式的方法可以在詹金斯工作流程中执行此操作 如何
  • 从单个搜索字段中搜索整数和字符串值

    我正在使用 Rails 4 和 Ransack 我无法搜索整数和字符串值 到目前为止我尝试过这段代码 In view div class field div div class actions div
  • 尝试从 ASP.NET 应用程序运行进程

    我需要在服务器上运行一个应用程序 我有一个可执行文件 它可以通过终端服务在我自己的权限下运行得很好 当我使用 VS 运行该站点时 它也可以通过 asp net 在我自己的计算机上运行良好 当我尝试在真正的 IIS 上运行我的网站时 它就挂起
  • 从私有 Bitbucket 存储库安装 Python 包

    我创建了一个 Python 3 5 工作包 它位于一个私人 Bitbucket 存储库中 我可以轻松提取代码并执行 python setup py install 来安装它 但我想尝试消除以下步骤必须提取代码并在我的计算机上拥有多个副本 同
  • 如何将 json POST 数据作为对象传递给 Web API 方法?

    ASP NET MVC4 Web API 应用程序定义了 post 方法来保存客户 客户在 POST 请求正文中以 json 格式传递 post 方法中的客户参数包含属性的空值 如何解决此问题以便发布的数据将作为客户对象传递 如果可能的话