为什么我的字符串式JSON更改没有提交给我的控制器?

时间:2015-03-16 14:20:02

标签: c# jquery asp.net-mvc-4 model model-binding

我有一个模型,我发送到我的视图。由于此模型中包含多个复杂对象,因此我使用var model = <%= Html.Raw(Json.Encode(Model)) %>;将模型作为全局变量公开给所有jQuery方法。

在我完成编辑模型(创建新项目,更新现有项目以及将对象从一个地方更改为另一个)之后,我使用以下代码将其发布到控制器:

$("#Update").click(function () {
    $.ajax({
            url: '<%= Url.Action("Update", "Editor") %>',
            type: "POST",
            dataType: 'json',
            data: JSON.stringify({aModel: model}),
            success: function (data) {
            }
        }).done(function (result) {
    });
});

在我的控制器中接收:

 [HttpPost]
 public ActionResult Update(MyModel aModel)
 {
     ModelState.Clear()
     aModel.Execute();
     return View("path/to/view");
 }

当我检查JSON.stringify({aModel: model})的结果时,我可以看到我的更改。但是,对象aModel没有收到此更改。

我试图清除ModelState,我试图避免缓存,我尝试从模型中复制一个现有元素并更改其值,而不是创建一个新项目以推送到Json数组,但这些都不起作用。

我的模型如下:

public class MyModel
{
     public Dictionary<string, List<Item>> Items { get; set; }
     public List<ItemProperty> Properties { get; set; }
}

字典会导致模型招标问题吗?假设这是一个模型招标问题。

有什么想法吗?

编辑1

根据评论,我认为问题可能出在复杂类型ItemItemProperty中。我尝试将无参数构造函数和公共setter用于Id属性,但它似乎并没有解决问题。

以下是课程:

public class Item
{
    public const string CONST = "Value";

    private SubItem aSubItem;
    public List<SubItem> SubItems { get ; set;  }

    public string Id { get; private set; }
    public string Name { get; set; }
    public string Help { get; set; }
    public DateTime Time { get; set; }

    public Item(string anId)
    {
        Id = anId;
    }
}

public class SubItem
{
    public List<ItemProperty> Properties = new List<ItemProperty>();

    public string Id { get; private set; }
    public string Subtitle { get; set; }
    public bool SubtitleVisible { get; set; }
    public bool Visible { get; set; }
    public MyEnumType Type { get; set; }

    public SubItem(string anId)
    {
        Id = anId;
    }  
}

public class ItemProperty
{
    public string Id { get; private set; }
    public string Title { get; set; }
    public string Path { get; set; }
    public bool Visible { get; set; }
    public MyAction CustomAction = new MyAction();

    public ItemProperty(string anId)
    {
        Id = anId;
    }
}

public class MyAction
{
    public string ActionName { get; set; }
}

发布时的序列化模型。我从原始模型中更改的唯一内容是Name属性:

"{"Items":
    {"ITEM1":
        [{"SubItems":
            [{"Properties":[],
              "Subtitle":"Other",
              "SubtitleVisible":true,
              "Id":"Other",
              "Visible":true,
              "MyEnumType":0}
             ],
          "Help":"",
          "Name":"ADDED A NAME TO SEND TO THE CONTROLLER",
          "Id":"ITEM1",
          "Time":"/Date(-62135578800000)/"},
      ...

1 个答案:

答案 0 :(得分:0)

那是因为你发布了一个字符串。事实上它看起来就像JSON一样毫无意义。发布实际对象。默认情况下,jQuery会对其进行编码并以可以由您的操作解析的格式发送它。当你正在处理它时,你只是发布一个字符串,模型绑定器试图绑定到MyModel实例,但因为MyModel是一个类类型,而不是一个字符串类型,它失败了。

$.ajax({
        url: '<%= Url.Action("Update", "Editor") %>',
        type: "POST",
        dataType: 'json',
        data: {aModel: model},
        success: function (data) {
        }
    }).done(function (result) {
});