【问题标题】:FromBody Item Coming Back as NullFromBody 项返回为 Null
【发布时间】:2018-05-06 22:53:24
【问题描述】:

我正在使用 JSGrid 来修改数据。我正在尝试按如下方式设置 updateItem:

updateItem: function (item) {
                return $.ajax({
                    type: "PUT",
                    url: "/api/data/" + item.logID,
                    data: item,
                    contentType: "application/json;charset=utf-8",
                    dataType: "json"
                });
            }

我有一个模型如下:

public class LogEntry
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string comment { get; set; }
    public bool modified { get; set; }
    public DateTime inTime { get; set; }
    public DateTime outTime { get; set; }
    public double totalHrs { get; set; }
    public int logID { get; set; }
}

这是我的 ApiController 类,其中包含 Put 方法:

public class DataController : ApiController
{
    public void Put(int id, [FromBody]LogEntry item)
    {
        if(item != null)
        {
           //DO STUFF
        }

    }
}

但是,无论我做什么,该项目始终为 Null。我尝试了以下方法:

  • 更改为 [FromBody]JObject 项
  • 更改为 [FromBody]String 项
  • 将 data: 字段更改为 Json.Stringify
  • 将 [FromBody]String 改为 String
  • 在 updateItem ajax 调用中添加和删除 application/json;charset=utf-8 的上下文类型。

我使用 Fiddler 查看发回的数据。它显示了正在发送的正确 JSON,但 Put 方法似乎没有获取该数据。

任何关于可能导致这种行为的想法都会很棒。我一直在研究,但还没有任何效果。

解决说明

事实证明,Caz1224 和 CodeFuller 的两个答案都有助于解决这个问题。 CodeFuller 查找错误消息的方式引导我将 JSON 返回到服务器。尽管 Fiddler 说它是正确的,但它还是搞砸了。我更改了我的 Ajax 调用以对项目进行字符串化。然后与我的模型完全匹配。

return $.ajax({
                    type: "PUT",
                    url: "/api/data/" + item.logID,
                    data: JSON.stringify(item),
                    contentType: "application/json; charset=utf-8",
                    dataType: "json"

【问题讨论】:

  • “项目”是如何构建的?它是一个正确的 JSON 字符串吗?

标签: c# json asp.net-mvc-5


【解决方案1】:

FromBody 属性在这里不是严格要求的,因为非简单类型是默认从请求正文构建的。

到目前为止,我没有看到您的代码有任何问题,它应该适用于有效请求。似乎问题出在发送的请求上,并导致模型绑定错误。要继续进行分析,请检查以下内容:

  1. Put() 方法中检查ActionContext.ModelState.IsValid 的值。是真是假?
  2. 如果是false,请在调试器中检查集合ActionContext.ModelState.Values。它应该包含模型绑定错误,这些错误会暗示您确实发生了问题。

【讨论】:

  • 好吧,这确实显示了我可以用来尝试解决问题的东西。我在解析布尔值时遇到错误。我会玩一会儿,看看能不能弄明白。当我查看 Fiddler 中的 JSON 选项卡时,很简单,JSON=firstName 就是这样。所以我猜它在那里。
  • 感谢您的帮助。我能够成功地让代码工作。
【解决方案2】:

我遇到了这个问题,而且很痛苦!

这就是最终为我工作的原因。 第一部分是我的 javascript(我想这就是你制作 JSON 的方式)

“列表”是我的数组,它与我的 C# 模型完美匹配(即使是这样,也很重要)。

Javascript 构建列表

var List = [];
$.each(_questions, function () {
    var limitID = this.id.substr(-1);
    var Quest = $('#Quest_' + ID).val();
    var objectpush = {
        LimitID: limitID,
        Quest: Quest,
        ID: ID
    }
    List.push(objectpush);

然后在 AJAX 调用中进一步指定数据,如下所示:

data: JSON.stringify(List),

最后这是我的 C# API

public JsonResult QueryLimits(int UserID, [FromBody] List<List> List)

希望这有助于您走上正轨。不要只是复制代码,因为我在整个代码中将名称更改为 List,这会导致问题!

卡兹

【讨论】:

  • 您可以使用[JsonProperty] 将您的类属性映射到 JSON 属性(如果它们不匹配,包括大小写)。
  • 谢谢弗兰克,我会在以后的编码中研究它。我只是对 case =P 很迂腐
  • 通过 Fiddler 回顾 JSON,它似乎完全匹配。但是,从那时起我更改了我的代码,现在它似乎有点乱了。使用 CodeFuller 的方法查看错误消息显示我收到错误解析布尔值。
  • 感谢您的帮助。尽管 Fiddler 说它是正确的,但它最终还是变成了一些糟糕的 JSON。
猜你喜欢
  • 2020-01-23
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 2013-03-20
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多