FromBody项目回归为空

时间:2017-11-23 04:33:22

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

我正在使用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
        }

    }
}

然而无论我做什么,该项目总是空的。我尝试过以下方法:

  • 更改为[FromBody] JObject项目
  • 更改为[FromBody]字符串项
  • 将数据:字段更改为Json.Stringify
  • 将[FromBody]字符串更改为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"

2 个答案:

答案 0 :(得分:0)

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

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

" List"是我的数组完美匹配(即使对于这种情况,这很重要)我的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,这将导致问题!

Caz

答案 1 :(得分:0)

此处不严格要求

FromBody属性,因为默认情况下会从请求正文构建非简单类型。

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

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