【问题标题】:AJAX null parameter in controller action控制器操作中的 AJAX 空参数
【发布时间】:2019-08-13 13:11:09
【问题描述】:

我想将值从我的视图传递给控制器​​操作,但是每次我这样做时参数都是空的。我看过多篇关于相同事情的帖子,但似乎不太正确..我的代码如下

控制器动作

[HttpPost]
    public IActionResult GetTest(string data)
    {
        var jSon = JsonConvert.SerializeObject(channles[0]);

        return Json(jSon);
    }

查看 (AJAX) 代码

function testAjax() {

        $("#searchButton1").click(function () {
            $.ajax({
                type: "POST",
                url: '@Url.Action("GetTest", "DataGridWebApi")',
                data: { data: "test" },
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    alert("Hello: " + response.Name + " .\nCurrent Date and Time: " + response.DateTime);
                },
                failure: function (response) {
                    alert(response.responseText);
                },
                error: function (response) {
                    alert(response.responseText);
                }
            });
        });
}

我在控制器操作中打断点,但参数始终为空。我还尝试将控制器操作更改为接受对象而不是字符串,但似乎没有任何效果。

我做错了什么?

【问题讨论】:

  • 这是 CORE 还是 MVC?
  • 这是针对.net Core的asp mvc
  • @Steve 好用!!谢谢!这是什么原因?因为它是单个字符串而不是对象?如果您作为答案发布,我将标记为正确。
  • 我认为这是因为它需要表单数据,而不是 json。

标签: jquery ajax asp.net-mvc asp.net-core


【解决方案1】:

您需要进行两项更改。你需要 [FromBody] 参数:

public IActionResult GetTest([FromBody]string data)

然后,您只需将字符串作为 JSON 发送:

data: JSON.stringify("test")

这可能看起来有点奇怪,但如果没有JSON.stringify,它将被发送为test,而您需要"test"。简而言之,您发送的是 JSON 内容类型的字符串,因此它必须是 JSON 字符串

【讨论】:

  • 克里斯,谢谢!!在执行此操作时,我似乎一直处于两种方法的中间,我已将此标记为解释的正确答案。有没有什么地方可以作为一般主题阅读更多内容?我想传递对象而不是单个字符串,但认为这将是一个很好的起点..
  • 具有讽刺意味的是,string 在这里更难,因为 JSON 是 object 表示法,并不是真的打算用于单个字符串。这就是为什么您必须更加小心地正确处理字符串的原因。有了一个对象,事情就更自然地工作了。
【解决方案2】:

删除该行:contentType: "application/json; charset=utf-8", 应该可以正常工作。就在昨天,我遇到了完全相同的问题。我们有一个执行 JSON 调用的标准方法,并且有人也插入了这一行,导致对象没有绑定到控制器。

【讨论】:

  • 这将起作用,但重要的是要注意您将切换到发送x-www-form-urlencoded,然后。换句话说,它是作为传统形式的帖子发送的。有些客户可能需要明确应用。
  • 就是这个.. 非常感谢!我将研究 contentType 的作用,因为我对前端还很陌生。
  • @ChrisPratt 你是对的。我们使用的应用来自早期的 MVC,我们在签名中使用(FormCollection form),然后我们使用Deserialize<WhateverObject>(form["whateverdata"])
【解决方案3】:

尝试在控制器参数中的string data 之前添加[FromBody]Here is why

【讨论】:

  • 不幸的是,这不起作用..我之前尝试过传递对象而不是单个字符串时确实尝试过。
  • @JoshuaAshton 尝试从 ajax 中删除 dataType
猜你喜欢
  • 2017-10-31
  • 2014-02-21
  • 2019-01-26
  • 2018-04-18
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2016-05-12
相关资源
最近更新 更多