发送具有未知属性的JavaScript对象到asp.net MVC控制器
我已经阅读了相当多的博客和stackoverflow的答案如何发送一个JavaScript对象到asp.net MVC控制器。但到目前为止,我看到的所有示例都需要您了解JavaScript对象的哪些属性(因为它们都将JavaScript对象转换为C#对象)。发送具有未知属性的JavaScript对象到asp.net MVC控制器
当我在asp.net webforms中使用PageMethods时,我可以发送任何复杂的JavaScript对象或数组(甚至是层次数据),并将其转换为我可以迭代的字典。任何机会我可以在asp.net MVC中做类似的事情吗?
我现在发现这对我的作品的一种方式。
- 我正在将我的数据转换为json并将其作为字符串接收到我的ASP.net MVC控制器中。
- 然后我使用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它不是很优雅,但一个职位会以同样的方式工作。
你可以做的是使用jQuery插件toDictionary,这个插件将改变你的对象是ASP.NET MVC字典默认模式粘结剂可以理解
例如
$.ajax({
url: "/SomeURL",
type: "POST",
data: $.toDictionary(dataToSend)
});
记住dataToSend是你的对象
连结此http://erraticdev.blogspot.com/2010/12/sending-complex-json-objects-to-aspnet.html –
看起来有希望的 - 但我不知道如果它提供了我所需要的,因为我无法实现它的工作。我不知道mvc控制器中的参数使用什么类型。在博客例子他只显示其与“预定义的类”(Person和汽车),但我没有这样的服务器端类,因为我不知道的JavaScript对象都将有哪些属性做。 – Preli
您是否尝试过使用Request.Forms
字典?
public ActionResult MyAction(FormCollection formValues)
{
}
遍历formValues
是的,我试过了。但是,当我拥有分层数据(我有)时,我感到非常不方便。因为一切都将是一个平面清单。 – Preli
不幸的是,它不在我的例子中工作 - 我的参数始终为空。你能告诉我服务器端控制器的动作是怎么样的。 (该参数?) – Preli
它仍然不是为我工作(甚至你的示例代码)。项目始终为空或只是空的。我不知道我做错了什么。我使用asp.net MVC 3 – Preli