我的目标是将字符串发送到asp.net 5 web api方法,然后让方法只返回一个字符串作为结果。
这是我的js:
$("#btnChangeName").click(function() {
var prodName = $("#txtProductName").val();
var url = 'http://localhost:27081/api/products/changename';
$.ajax({
url: url,
type: 'POST',
dataType: 'text',
data: JSON.stringify({name: prodName}),
success: successFuncApi,
error: function(xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
});
控制器:
[HttpPost]
[Route("/api/functions/changename")]
public string ChangeName([FromBody]dynamic value)
{
string newName = ChangeNameHelper(value.name.ToString());
return newName;
}
最奇怪的是,当我使用邮差或提琴手并在原始身体中发送类似的内容时:
{"name":"John"}
它完全正常。为什么它不适用于AJAX请求?我的动态参数最终为空。
是否100%要求始终绑定到新的Web API中的模型?在这种情况下,我只处理一个简单的字符串和一个简单的字符串输出。
答案 0 :(得分:4)
您需要使用JSON.stringify
序列化数据。
所以尝试替换它:
data: {name: name}
用这个:
data: JSON.stringify({name: name})
JSON适用于现代浏览器。但是,如果您需要支持IE8,或者您的浏览器不支持IE8,则需要包含json2
<强>更新强>
@Blake,这是我对你的评论的回复:放入评论部分太长了。
之前我没有使用dynamic
在我的Web API中接收复杂类型。但是,我使用了JToken
。然后,您可以像这样访问name
属性:
public string ChangeName([FromBody]JToken jsonbody)
{
var name = jsonbody.Value<string>("name");
...
}
答案 1 :(得分:0)
您无需创建发送字符串的对象。这将有效。
[HttpPost]
[Route("/api/functions/changename")]
public string ChangeName([FromBody]string value)
{
string newName = ChangeNameHelper(value=);
return newName;
}
诀窍是发送 JSON 字符串,而不仅仅是字符串。它们不一样。
$("#btnChangeName").click(function() {
var prodName = $("#txtProductName").val();
var url = 'http://localhost:27081/api/products/changename';
$.ajax({
url: url,
type: 'POST',
dataType: 'text',
contentType:'application/json',
data: JSON.stringify(prodName),
success: successFuncApi,
error: function(xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
});