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端需要做一些事情?

如有任何帮助,将不胜感激

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

您可以使用模型类来绑定客户端数据,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: sampleData更改为data: $.toJSON(sampleData)

  4. 在您的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程序集,但我相信你们都能理解。