我有一个模型,我发送到我的视图。由于此模型中包含多个复杂对象,因此我使用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
根据评论,我认为问题可能出在复杂类型Item
和ItemProperty
中。我尝试将无参数构造函数和公共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)/"},
...
答案 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) {
});