使用json传递关联数组:在控制器中期望哪种类型?
在客户端,我有一个关联数组,我存储“Guid” – “int”对。 我使用json将数组传递给服务器:
$.ajax({ url: methodUrl, type: 'POST', async: false, data: { values: items }, dataType: 'json', success: function (data) { //... } });
我尝试传递的对象看起来像这样(取自Chrome调试器):
items: Object 44f871e0-daee-4e1b-94c3-76d633a87634: 1 698ce237-3e05-4f80-bb0d-de948c39cd96: 1
在控制器中我有一个方法
public ActionResult Method(Dictionary values) { }
但是,属性值保持为null。 只有客户端的Guids列表和控制器中的List一切正常。 我怀疑我应该为控制器中的值选择另一种类型,而不是字典。 我也尝试在ajax请求中添加“traditional:true”,但没有成功。
任何建议表示赞赏!
这是我在使用POST命令时所做的事情:
var data = { values: items } var obj = $.toJSON(data); $.ajax({ url: methodUrl, type: 'POST', async: false, data: obj, dataType: 'json', success: function (data) { //... } });
这应该正确地发送到你的Controller,你不应该使用Dictionary对象,你应该匹配从客户端到服务器端的对象。 我使用一个自定义对象,它有一个Guid
和一个int
作为属性,并使用它 – .NET将匹配这两个。 话虽如此,使用词典是完全合理的,但这是个人偏好。
即
public CustomObject { public Guid MyGuid { get; set; } public int MyNumber { get; set; } } public ActionResult Method(List values) { }
有多个参数:
items.SecondNumber = yourVariable; // In reality, you'd have a loop around your items and set this SecondNumber. var data = { values: items } var obj = $.toJSON(data); public CustomObject { public Guid MyGuid { get; set; } public int MyNumber { get; set; } public int SecondNumber { get; set; } // This is why we use CustomObject }
虽然我选择了dixon的答案作为解决方案,但我最终设法避免使用任何其他类。
最重要的部分是发送到服务器的集合的类型应该是具有键值类型的javascript数组。 例如,这是我在发送到服务器之前在js中创建的对象:
items : Array[2] 0: Object key: "ddac666f-310f-4022-a22c-c542355b765e" value: 1 1: Object key: "ce9ae5a6-e6a6-4bb6-b61c-b1cc324be049" value: 1
在此之后,有必要对其进行字符串化,然后发送到服务器。
var obj = JSON.stringify(items); $.ajax({ url: teilnahmen.AddNewTeilnahmenUrl, type: 'POST', traditional: true, dataType: 'json', data: obj, contentType: "application/json", success: function (data) { //... } });
在服务器端:
public ActionResult AddNewTeilnahmen(Dictionary values) { ... }
我仍然相信这个解决方案更好,因为它不需要创建很可能永远不会重用并且已经存在于.NET中的类。 但正如迪克森正确提到的那样,这是一个品味问题。
除了Anelook的最后评论,这里是javascript数组的创建:
var items = []; $(something).each(function (index, element) { var item = { "key": element.guid, "value": element.number }; items.push(item); });
- asp.net mvc 4 javascript里面的razor block抛出错误
- 在回发后显示带有MVC C#的弹出确认消息
- 动态属性的Asp.Net MVC 3编辑器
- 如何将自定义URL参数添加到MVC RedirectToAction
- 指定密钥太长; 最大密钥长度为767字节 – ASPNet Identity MySQL
- 调整MVC 4 WebApi XmlSerializer以丢失nameSpace
- 如何将OnAuthenticated事件中的信息传递给控制器和SignIn?
- entity framework自动生成GUID
- MVC中的Razor页面在System.Web.Helpers找不到时发出编译错误