ASP.NET MVC ActionResult未从ajax请求中读取json数据
本文关键字:读取 json 数据 请求 ajax NET MVC ActionResult 未从 ASP | 更新日期: 2023-09-27 18:29:19
我有一个关于在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脚本文件中,我定义了点击函数
$("#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: 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: sampleData
更改为data: $.toJSON(sampleData)
-
在您的global.asax中,添加
using System.Web.Mvc;
。然后在Application_Start()方法中,添加行ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
这使得将JSON发送到我的控制器操作方法成为可能。在我偶然发现这个方法之前,我得到了和你一样疯狂的URL编码混乱。我提供这些信息的依据来自Phil Haacked的一篇文章。
感谢大家的帮助。
由于我使用了更多答案的组合,我将在这里进行总结。我所要做的是在jquery中重新定义sampledata对象,其中属性名称没有用引号括起来。然后我听从了汤米的回答。最后,我更改了我的SomeMethod签名,返回JsonResult类型,并根据whordaddy的回答接受自定义定义的模型类作为参数。我会把你的帖子标记为有用的,但我还没有足够的声誉。再次感谢大家的帖子。
只是一个简短的提示。在Tommy答案的第4点中,你需要引用你下载的Microsoft.Web.Mvc.dll程序集,但我相信你们都能理解。