【问题标题】:ASP.NET MVC ActionResult not reading json data from ajax requestASP.NET MVC ActionResult 未从 ajax 请求中读取 json 数据
【发布时间】:2012-03-29 12:28:48
【问题描述】:

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

我有 ASP.NET MVC C# 项目(.NET 框架 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 参数为空。我还尝试在 ajax 函数中修改“数据”行,如下所示: data: JSON.stringify(sampleData), 但效果不佳。

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

任何帮助将不胜感激

【问题讨论】:

  • 向我们展示生成的 json 字符串。这很可能是这里的关键。
  • 生成的字符串是 {"RaceName":"Human","StatOrigValue":"14","FreePts":"5"}

标签: c# asp.net-mvc jquery


【解决方案1】:

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

这个blog post中有一个例子。

【讨论】:

    【解决方案2】:

    您将 JSON 对象传递给操作,而不是字符串。你很接近 JSON.stringify:

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

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

    【讨论】:

    • 这会生成这个字符串:stat=%7B%22RaceName%22%3A%22%C4%8Clov%C4%9Bk%22%2C%22StatOrigValue%22%3A%2214%22%2C% 22FreePts%22%3A%225%22%7D 但 ActionResult 的参数仍然为空
    【解决方案3】:

    只需创建一个涵盖 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"}}
    }
    

    【讨论】:

    • 谢谢。这就是我最初定义模型类的方式(JsonResult 返回类型除外),但这不起作用,所以我尝试使用字符串。我不得不将它与 Tommy 的部分解决方案结合起来。
    【解决方案4】:

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

    1. 在您的视图/主布局页面/任何地方下载并引用JQuery JSON plugin

    2. 下载 ASP.NET MVC 2 Futures 库并引用 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 发送到我的控制器操作方法成为可能。在我偶然发现这种方法之前,我遇到了同样疯狂的 URLencoded 混乱。我提供此信息的依据来自Phil Haacked article here

    【讨论】:

    • 感谢您的帮助。这解决了问题。我将此与 whosrdaddy 的解决方案相结合,并更改了方法签名以使用自定义模型类并返回 JsonResult。我会标记有用的答案,但我还没有必要的声誉。
    • @LetThereBeByte:很棒的人,很高兴它对你有用,找到一个可行的解决方案比几个 SO 点更重要 :)
    【解决方案5】:

    感谢大家的帮助。

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

    只是一个简短的说明。在第没有。 Tommy 的回答中的 4 个您需要参考您下载的 Microsoft.Web.Mvc.dll 程序集,但我相信你们都会弄清楚。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2011-08-23
      • 2014-03-30
      • 2021-08-29
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2017-05-03
      相关资源
      最近更新 更多