AJAX和Web Api Post方法-它是如何工作的
本文关键字:何工作 工作 Web Api Post 方法 AJAX | 更新日期: 2023-09-27 18:06:15
我试图用AJAX/Jquery和c#写我的数据库。每当我将参数传递给c#代码时,它都会显示为空。我使用visual studio在创建控制器类时生成的默认模板。任何帮助将不胜感激!
注意:这是我正在尝试调用的rest服务。(一个正规的ASP网站…不是MVC。而且,GET Rest api工作得很好。)
Jquery/AJAX:var dataJSON = { "name": "test" }
$('#testPostMethod').bind("click", GeneralPost);
function GeneralPost() {
$.ajax({
type: 'POST',
url: '../api/NewRecipe',
data:JSON.stringify(dataJSON),
contentType: 'application/json; charset=utf-8',
dataType: 'json'
});
}
c# //If I remove the [FromBody] Tag then when I click the button this method is never called.
public void Post([FromBody]string name)
{
}
编辑:我已经稍微调整了我的代码,但仍然遇到同样的问题。回顾一下,它正在加载POST方法,但它传递的是空值。
c# public class RecipeInformation
{
public string name { get; set; }
}
public void Post(RecipeInformation information)
{
}
AJAX: var dataJSON = { information: { name: "test" } };
$('#testPostMethod').bind("click", GeneralPost);
console.log(dataJSON);
function GeneralPost() {
$.ajax({
type: 'POST',
url: '../api/NewRecipe',
data: dataJSON,
contentType: 'application/json; charset=utf-8',
});
}
对于简单类型,在服务器端:
public void Post([FromBody]string name)
{
}
在客户端,你只需要定义是否要以json格式发送:
var dataJSON = "test";
$('#testPostMethod').bind("click", GeneralPost);
function GeneralPost() {
$.ajax({
type: 'POST',
url: '/api/NewRecipe',
data: JSON.stringify(dataJSON),
contentType: 'application/json; charset=utf-8',
dataType: 'json'
});
}
如果你想让它在复杂类型中工作,从服务器端你应该定义:
public class RecipeInformation
{
public string name { get; set; }
}
public class ValuesController : ApiController
{
public void Post(RecipeInformation information)
{
}
}
客户端:
var dataJSON = { name: "test" };
$('#testPostMethod').bind("click", GeneralPost);
function GeneralPost() {
$.ajax({
type: 'POST',
url: '/api/NewRecipe',
data: JSON.stringify(dataJSON),
contentType: 'application/json; charset=utf-8',
dataType: 'json'
});
}
您可以尝试这样做并使用jquery参数方法
var postData = {
name : 'name'
}
$('#testPostMethod').bind("click", GeneralPost);
function GeneralPost() {
$.ajax({
type: 'POST',
url: '../api/NewRecipe',
data: $.param(postData,true),
contentType: 'application/json; charset=utf-8',
dataType: 'json'
});
}
我想你使用的是ASP。NET WebAPI,它从URL绑定所有简单类型(int, bool, string等),从body绑定所有复杂类型。当你用FromBody
属性标记name时,它会从请求体绑定它,而不是url映射。
你可以阅读更多关于ASP的信息。. NET WebAPI路由和参数绑定:
- 在www.asp.net上在www.west-wind.com上
- 和MSDN
您还缺少数据契约属性如果你创建一个你的类,如:
[DataContract]
public class RecipeInformation
{
[DataMember]
public string name { get; set; }
}
这些属性可以在System.Runtime中找到。序列化,Json解析器(Json.NET)使用它们来(帮助)反序列化模型。
API控制器中的绑定有点奇怪。我相信:
public void Post([FromBody]RecipeInformation information)
var dataJSON = { name: "test" };
应该可以工作,如果你只是把它作为表单数据传递,它肯定会工作。
我在Microsoft Docs的帮助下发现了这个问题使用如上所述的JS代码
$.post('api/updates/simple', { "": $('#status1').val() });
我错过的是添加空属性名称,所以OP需要做的是{"":data:JSON.stringify(dataJSON)},
而不是data:JSON.stringify(dataJSON),
$("#updateuser")。点击(函数(){
var id = $("#id").val();
var dataJSON = $("#username").val();
alert("" + dataJSON);
$.ajax({
url: 'http://localhost:44700/api/Home/' + id,
type: 'PUT',
data: JSON.stringify(dataJSON),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (data, textStatus, xhr) {
$.each(data, function (key, val) {
$("<li>" + val + "</li>").appendTo($("#names"));
})
},
error: function (xhr, textStatus, errorThrown) {
alert('Error in Operation');
}
})
})