ASP.NET MVC ActionResult不从ajax请求中读取json数据

我有一个关于在C#中读取JSON字符串的问题。 我的方案如下。

我有ASP.NET MVC C#项目(.NET framework 3.5)。 在LobbyController我有

. . . using System.IO; using System.Web.Script.Serialization; . . . [HttpPost] public ActionResult SomeMethod(string sampleData) { //do stuff here } 

在jquery脚本文件中我定义了点击function

 $("#buttonID").click(function() { var sampleData = { "property1": $('#elementID1').val(), "property2": $('#elementID2').val(), "property3": $('#elementID3').val() }; $.ajax({ url: "/Lobby.aspx/SomeMethod", type: "POST", data: sampleData, dataType: "json", contentType: "application/json; charset=utf-8", success: function() { $('#message').html('Success').fadeIn(); }, error: function() { $('#message').html('Error').fadeIn(); } }); }); 

现在,单击ajax函数启动并在控制器中按预期调用SomeMethod,但sampleData参数为null。 我也尝试在ajax函数中修改“data”行,如下所示: data: JSON.stringify(sampleData),但它也不能正常工作。

我试图提醒sampleData对象的各个属性,并且它们具有它们应该具有的值,但由于某种原因,ActionMethod的sampleData参数为null。 有人能告诉我我错过了什么吗? 也许这是我的语法错误或者需要在c#方面做些什么?

任何帮助,将不胜感激

您可以使用模型类来绑定客户端数据,MVC3内置了对JSON绑定的支持。

这篇博客文章中有一个例子。

您将JSON对象传递给操作,而不是字符串。 您与JSON.stringify关系密切:

 data: "sampleData=" + encodeURIComponent(JSON.stringify(sampleData)) 

这应该将一个字符串发送到包含sampleData对象的JSON表示的服务器

只需创建一个涵盖JSON模型的类,我假设您拥有内置JSON模型绑定的MVC3。

 public class MyModel { public string RaceName{get; set;} public int StatOrigValue{get; set;} public int FreePts{get; set;} } [HttpPost] public JsonResult SomeMethod(MyModel sampledata) { //do stuff here return new JsonResult {Data = new {Success = "Success"}} } 

由于您使用的是.NET 3.5,我假设您使用的是MVC2。 我上周才遇到同样的问题。 我必须做一些事情:

  1. 在视图/主页面布局页面/ whereever中下载并引用JQuery JSON插件 。

  2. 下载ASP.NET MVC 2 Futures Library并引用Microsoft.Web.Mvc.dll程序集。

  3. data: $.toJSON(sampleData)更改为data: $.toJSON(sampleData)

  4. 在你的global.asax中, using System.Web.Mvc;添加using System.Web.Mvc; 。 然后在Application_Start()方法中添加行ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

这使得可以将JSON发送到我的控制器操作方法。 在我偶然发现这种方法之前,我遇到了同样疯狂的URL编码混乱。 我的基础来自Phil Haacked的文章 。

感谢大家的帮助。

由于我使用了更多答案的组合,我将在此总结。 我要做的是在jquery中重新定义sampledata对象,其中属性名称没有用引号括起来。 然后我跟着汤米的回答。 最后,我更改了SomeMethod签名以返回JsonResult类型,并根据whosrdaddy的答案接受自定义模型类作为参数。 我会将你的post标记为有用,但我还没有足够的声誉。 再次感谢大家的post。

快速说明一下。 在点没有。 Tommy的回答中你需要引用你已经下载过的Microsoft.Web.Mvc.dll程序集,但我相信你们都会搞清楚。