【问题标题】:Why is my json object empty in my ASP API?为什么我的 ASP API 中的 json 对象为空?
【发布时间】:2014-09-26 05:14:39
【问题描述】:

我正在尝试测试我的 asp api。

其中一个端点需要从浏览器获取一个 json 对象。为了测试这一点,我将一个 json 对象放入一个文本字段,然后对我的 api 进行 ajax 调用。 api被命中时,json对象始终为null。

我已经查看了这篇帖子:how to pass json post data to web api method as object,但这并没有解决我的问题。

这是我的对象:

{   "userName": "063bcdf2-36fd-4b8c-a5af-808da63744f6",
     "password" : "Password"
}

这是我的 ajax 调用:

        var submission = function () {
        var url = urlBase + "/api/Submission/";
        var testdata = $("input[name=submission]").val();
        alert(testdata);
        $.ajax(url, {
                type: "POST",
                data: JSON.parse(testdata),
                contentType: 'application/x-www-form-urlencoded'
        }).always(showResponse)
          return false;
        };

这是我的 api:

    [HttpPost]
    [ResponseType(typeof(SubmissionOutputModel))]
    public IHttpActionResult POST([FromBody]SubmissionInputModel submission )
    {
        if (ModelState.IsValid)
        {
            SubmissionService service = new SubmissionService();
            return Json(service.Submit(submission));
        }
        else
        {
            return BadRequest("Invalid Model State");
        }

    }

提交输入模型:

    public class SubmissionInputModel
{
    [Required]
    public string userName { get; set; }
    [Required]
    public string  password { get; set; }

}

ajax 中的警报显示数据正在发送,并且在调试模式下,api 被命中,但提交对象未设置为从 ajax 调用发送的数据。

如果有人可以提供帮助,将不胜感激!

【问题讨论】:

    标签: javascript asp.net ajax asp.net-mvc json


    【解决方案1】:

    我认为您需要 JSON.stringify 而不是解析,因为如果使用相反的方式,则解析。 JSON.parse 接受一个字符串并将其转换为 JSON 对象。

    尝试对你的测试数据进行字符串化

       $.ajax(url, {
                    type: "POST",
                    data: JSON.Stringify(testdata),
                    contentType: 'application/x-www-form-urlencoded'
            }).always(showResponse)
              return false;
            };
    

    如果这不起作用,请从 ajax 调用中省略 contentType,或者改为写 contentType:"application/json"。

    并发布您的 SubmissionInputModel。那里可能有一些错误的命名:)

    【讨论】:

    • 我尝试了 JSON.stringify() 但得到了相同的结果,所以我想我会在这里尝试 .parse() 方法。仍然没有快乐。
    • 尝试无内容类型:仍然为空。
    • 尝试使用 content-type: application/json 并且仍然为空。
    【解决方案2】:

    “测试数据”是什么样的?已经是json格式的字符串了吗?

    1.JSON.Parse 仅将字符串解析为 JSON,例如:

    JSON.parse('{}');              // {}
    JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
    

    2.content-type在你的情况下应该是application/json,你现在指定的值是默认值:

    contentType: 'application/json'
    

    3.同时,由于您的操作已经标记为[POST],因此ModelBinder 将尝试从请求正文中绑定您的模型,因此无需指定为[FromBody]

    【讨论】:

    • 是的,数据已经是json了。我试过 application/json 和 application/x-www-form-urlencoded 都没有运气。我也试过了,根本没有指定内容类型。
    【解决方案3】:

    好的,我找到了我快乐的地方!

    以下 ajax 调用最终将数据传递到 API:

            var submission = function () {
            var url = urlBase + "/api/Submission/";
            var testdata = $("input[name=submission]").val();
            alert(testdata);
            $.ajax(url, {
                type: "POST",
                data: testdata,
                contentType: 'application/json'
            }).always(showResponse)
            return false;
            };
    

    请注意,调用中的数据没有 JSON 方法,并且 contentType 是 'application/json'。

    感谢大家的帮助。我希望这可以帮助遇到这个问题的下一个可怜的灵魂!

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 2015-01-13
      • 2021-12-04
      • 2015-09-04
      • 1970-01-01
      相关资源
      最近更新 更多