发送具有未知属性的JavaScript对象到asp.net MVC控制器

发送具有未知属性的JavaScript对象到asp.net MVC控制器

问题描述:

我已经阅读了相当多的博客和stackoverflow的答案如何发送一个JavaScript对象到asp.net MVC控制器。但到目前为止,我看到的所有示例都需要您了解JavaScript对象的哪些属性(因为它们都将JavaScript对象转换为C#对象)。发送具有未知属性的JavaScript对象到asp.net MVC控制器

当我在asp.net webforms中使用PageMethods时,我可以发送任何复杂的JavaScript对象或数组(甚至是层次数据),并将其转换为我可以迭代的字典。任何机会我可以在asp.net MVC中做类似的事情吗?

我现在发现这对我的作品的一种方式。

  1. 我正在将我的数据转换为json并将其作为字符串接收到我的ASP.net MVC控制器中。
  2. 然后我使用json.net库来读取数据 - 因为此库允许我读取数据而不将其转换为C#(或VB)对象。

JavaScript代码:

//first include the json2 library for older browsers and jQuery 
$.post(url, {json: JSON.stringify(mydata)}); 

服务器端代码:

public void xyz(string json) 
{ 
    JObject j = JObject.Parse(json); 
    string name = (string)j.SelectToken("Products[0].Name"); 
    //... 
} 

的好处:它是 “正常” 的JSON,这意味着它是不是有些不常见的格式或接口类型。

编辑:我发现,如果我正在使用,我甚至不需要C#json库。净4 - 因为我可以在JavaScriptSerializer的帮助下将任何json字符串转换为字典:

JavaScriptSerializer jss = new JavaScriptSerializer(); 
Dictionary<string, object> data = (Dictionary<string, object>) jss.Deserialize<dynamic>(json_string); 

这将被转换为一个字典:

[{"key":0, "value":"something"},{"key":2, "value":"something else"},] 

很明显,你可以做字符串,字符串或整型,布尔或等..

例如,我有这样的方法:

public int CollabSortFolder(int FolderId, Dictionary<int, int> Items) 

我会使用GET拨打:

/CollabSortFolder?FolderId=111111&Items=[{"Key":3685,"Value":0},{"Key":3670,"Value":1},{"Key":3687,"Value":2}] 

现在作为一个GET它不是很优雅,但一个职位会以同样的方式工作。

+1

不幸的是,它不在我的例子中工作 - 我的参数始终为空。你能告诉我服务器端控制器的动作是怎么样的。 (该参数?) – Preli

+1

它仍然不是为我工作(甚至你的示例代码)。项目始终为空或只是空的。我不知道我做错了什么。我使用asp.net MVC 3 – Preli

你可以做的是使用jQuery插件toDictionary,这个插件将改变你的对象是ASP.NET MVC字典默认模式粘结剂可以理解

例如

$.ajax({ 
    url: "/SomeURL", 
    type: "POST", 
    data: $.toDictionary(dataToSend) 
    }); 

记住dataToSend是你的对象

+0

连结此http://erraticdev.blogspot.com/2010/12/sending-complex-json-objects-to-aspnet.html –

+0

看起来有希望的 - 但我不知道如果它提供了我所需要的,因为我无法实现它的工作。我不知道mvc控制器中的参数使用什么类型。在博客例子他只显示其与“预定义的类”(Person和汽车),但我没有这样的服务器端类,因为我不知道的JavaScript对象都将有哪些属性做。 – Preli

您是否尝试过使用Request.Forms字典?

public ActionResult MyAction(FormCollection formValues) 
{ 
} 

遍历formValues

+0

是的,我试过了。但是,当我拥有分层数据(我有)时,我感到非常不方便。因为一切都将是一个平面清单。 – Preli