【问题标题】:http.post Simple object from angularJS to c# Web api either null or all properties are nullhttp.post 从 angularJS 到 c# Web api 的简单对象为空或所有属性为空
【发布时间】:2017-03-09 16:34:18
【问题描述】:

首先,我承认这里有很多问题与我的问题很接近,但是我尝试了所有我能找到的解决方案,所以我仍然卡住了。

我的service.js中我的Service方法如下,用cmets;

postSimpleObject: function () {

    // Have tried this first, and have passed
    // as JSON.stringify(simpleObject)
    var simpleObject = {
        name: "J Doe",
        colour: "Red"
    };

    // tried to pass this next
    var simplerObject = '{ "Name": "J Done", "Colour":"Red"}';

    // escaped the quotations and tried this next
    var simplerObject2 = '{ \"Name\": \"J Done\", \"Colour\":\"Red\"}';

    return $http.post(apiUrl + "PostSimpleObject?item=" + JSON.stringify(simpleObject), {
        headers: {
            'Content-Type': 'application/json'
        }
    });
}

这是我在 API 端的 API 控制器函数;

public class CrudUserApiController : ApiController
{

    [System.Web.Http.HttpPost]
    public void PostSimpleObject(SimpleObject item)
    {
        var itemReceived = item;
    }    
}

我的简单对象类,在 api 方面;

public class SimpleObject
{
    public string Name { get; set; }
    public string Colour { get; set; }

}

现在,发生了什么;

  • API方法被触发,路由可以定位控制器和方法
  • 收到的模型/对象是一个新的 SimpleObject,两个成员的属性都为空

根据服务中的 cmets,我尝试传递一个字符串化对象、一个 json 字符串和一个转义的 json 字符串。

在 API 方面,我也尝试在签名中的 SimpleObject 参数前面使用 [FromBody] 属性。同样的事情也会发生。

我完全迷路了,非常感谢一些帮助。谢谢。

【问题讨论】:

  • 为什么要将数据附加到 URI?你试过这个吗? stackoverflow.com/a/20226220/5724584
  • 你试过$http.post(apiUrl + "PostSimpleObject", simpleObject, { headers: { 'Content-Type': 'application/json' }吗?
  • 您将数据作为参数传递(命名为item)是否有原因?
  • @ex0dm3nt 这完全正确。非常感谢。

标签: javascript c# angularjs asp.net-web-api


【解决方案1】:

出于多种原因,例如查询字符串长度限制,建议将内容发布在正文而不是查询字符串上。

也就是说,如果您坚持使用查询字符串,则需要使用 FromUri 属性告诉 WebAPI 查找查询字符串中的数据,因为默认值为正文:

[System.Web.Http.HttpPost]
public void PostSimpleObject([FromUri]SimpleObject item)
{
    var itemReceived = item;
}    

或者,您可以直接在正文上发布内容,如 ex0dm3nt 调用的那样:

$http.post(apiUrl + "PostSimpleObject", simpleObject);

【讨论】:

  • 非常感谢。我不确定我为什么要使用查询字符串——实际上我不知道你可以像这样直接传递正文。
  • @Aeptitude 欢迎您!从技术上讲,这两种方法在大多数情况下都有效,但正文通常是帖子和放置数据的预期机制。
【解决方案2】:

您只需像这样在$post 请求中将simpleObject 作为第二个参数传递:

postSimpleObject: function () {
    var simpleObject = {
        name: "J Doe",
        colour: "Red"
    };

    return $http.post(apiUrl + "PostSimpleObject", simpleObject);
}

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2017-12-09
    • 2016-05-29
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多