最近在把原来的 .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()}
但是后台也是获取不到值。请问这是什么原因呢?
直接 data:JSON.stringify(originalMarkdown) 试试
后台接收也是为Null。
@BUTTERAPPLE: 试试改为:
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
data: markdown
@dudu:
后台成功接收!
該不會是bug
您的意思是 .NET Core
中的Bug 吗? 还是我的程序的 Bug?
@BUTTERAPPLE:
.NET Core
你要知道若contentType为application/json 后天接受参数需要用[FromBody]特性标识,如果是表单则不用,可以看下我写的这篇文章:
http://www.cnblogs.com/CreateMyself/p/6246977.html
我也尝试过您说的,我去掉contentType
之后,后台也接收不到参数。然后在没有去处的情况下。我加上了[FromBody]
在 Controller 中。也是无法取到值的。
@BUTTERAPPLE: 那就很明显是你前台参数的问题了,你后台怎么用的string接收,用对象接收前台序列化的数据
您在 http://www.cnblogs.com/CreateMyself/p/6246977.html 这篇文章里面说的问题,我前几天刚遇到就是在我用ajax post
需要传递一个 Entity
对象到后台操作时,后台的Controller
死活取不到值。 后来我加上[FromBody]
就可以取到值了。然后这几天我后台接收一个参数 string
接收不到。
@BUTTERAPPLE: 你仅仅只接收一个简单值 直接这么做不就可以了吗
[HttpPost("{body}")]
public IActionResuklt a(string body)
{}
post("api/body/").....
加frombody后参数名随意.但你得用是一个实体类接.然后这个类中有一个string成员名字叫body
总的来说就是:看请求报文.分析原因.
对的,是这样的。加上[FromBody]
需要一个实体对象去接收,如果只用一个简单 string 、int参数的话就不能用[FromBody]
的
Status Code: 204 No Content