首页 新闻 会员 周边

.NET Core中 $.ajax 的 POST 请求,后台Controller 中获取不到参数的问题?

0
悬赏园豆:20 [已解决问题] 解决于 2017-01-18 18:04

最近在把原来的 .NET Framework 的项目迁移到 .NET Core 上,遇到了一个问题。就是 ajax Post 请求的问题,具体代码实例如下:

Ajax请求代码:

var originalMarkdown = $("#txtQuestionMarkdown").val();
    var markdown = {};
    markdown.body = originalMarkdown;
    if (originalMarkdown === "") {
        $("#txtQuestionPreview").html("<p>无内容</p>");
    }
    else {
        $("#txtQuestionPreview").html("<p>正在格式转换中....</p>");
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "/a/MarkdownTransform",
            data: JSON.stringify(markdown),
            dataType: "text",
            success: function (result) {
                $("#txtQuestionPreview").html(result);
            },
            error: function (xhr) {
                $("#txtAnswerPreview").html("<p>格式转换失败</p>");
            }
        });

Controller(C#)

[HttpPost]
 public async Task<string> MarkdownTransform(string body)
 {
    //....
 }

上面那段代码,在.NET Framework 中后台是能够成功获取到值的,但是在.NET Core中不行。我在 Google 已经我们园子中也找了一些资料,有人说参数的类型不正确,或者传的格式不正确。
我尝试过把 dataType 改成 dataType: "json" 但是也没有用。
也尝试过把 data 改成 data: { body : $("#txtQuestionMarkdown").val()} 但是后台也是获取不到值。请问这是什么原因呢?


BUTTERAPPLE的主页 BUTTERAPPLE | 老鸟四级 | 园豆:3190
提问于:2017-01-18 10:10
< >
分享
最佳答案
2

直接 data:JSON.stringify(originalMarkdown) 试试

收获园豆:20
dudu | 高人七级 |园豆:30994 | 2017-01-18 13:19

后台接收也是为Null。


BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2017-01-18 13:31

@BUTTERAPPLE: 试试改为:

contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
data: markdown
dudu | 园豆:30994 (高人七级) | 2017-01-18 17:48

@dudu:

后台成功接收!


BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2017-01-18 18:04
其他回答(3)
-2

該不會是bug

RosonJ | 园豆:4910 (老鸟四级) | 2017-01-18 10:18

您的意思是 .NET Core中的Bug 吗? 还是我的程序的 Bug?


支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2017-01-18 10:19

@BUTTERAPPLE: 

.NET Core

支持(0) 反对(0) RosonJ | 园豆:4910 (老鸟四级) | 2017-01-18 10:31
1

你要知道若contentType为application/json 后天接受参数需要用[FromBody]特性标识,如果是表单则不用,可以看下我写的这篇文章:
http://www.cnblogs.com/CreateMyself/p/6246977.html


Jeffcky | 园豆:2789 (老鸟四级) | 2017-01-18 10:21

我也尝试过您说的,我去掉contentType 之后,后台也接收不到参数。然后在没有去处的情况下。我加上了[FromBody] 在 Controller 中。也是无法取到值的。


支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2017-01-18 10:26

@BUTTERAPPLE: 那就很明显是你前台参数的问题了,你后台怎么用的string接收,用对象接收前台序列化的数据


支持(0) 反对(0) Jeffcky | 园豆:2789 (老鸟四级) | 2017-01-18 10:29

您在 http://www.cnblogs.com/CreateMyself/p/6246977.html 这篇文章里面说的问题,我前几天刚遇到就是在我用ajax post 需要传递一个 Entity 对象到后台操作时,后台的Controller 死活取不到值。 后来我加上[FromBody] 就可以取到值了。然后这几天我后台接收一个参数 string接收不到。


支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2017-01-18 10:30

@BUTTERAPPLE: 你仅仅只接收一个简单值 直接这么做不就可以了吗

[HttpPost("{body}")]
public IActionResuklt a(string body)
{}

post("api/body/").....


支持(0) 反对(0) Jeffcky | 园豆:2789 (老鸟四级) | 2017-01-18 10:35
0

加frombody后参数名随意.但你得用是一个实体类接.然后这个类中有一个string成员名字叫body

总的来说就是:看请求报文.分析原因.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-01-18 10:36

对的,是这样的。加上[FromBody] 需要一个实体对象去接收,如果只用一个简单 string 、int参数的话就不能用[FromBody]


支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2017-01-18 10:38

Status Code: 204 No Content


支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2017-01-18 11:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册