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。 我上周才遇到同样的问题。 我必须做一些事情:
-
在视图/主页面布局页面/ whereever中下载并引用JQuery JSON插件 。
-
下载ASP.NET MVC 2 Futures Library并引用Microsoft.Web.Mvc.dll程序集。
-
将
data: $.toJSON(sampleData)
更改为data: $.toJSON(sampleData)
-
在你的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程序集,但我相信你们都会搞清楚。