所以,根据this:
- 如果参数是“简单”类型,则Web API会尝试获取该值 来自URI。简单类型包括.NET基元类型(int, bool,double等等,加上TimeSpan,DateTime,Guid,decimal, 和字符串,以及具有可转换的类型转换器的任何类型 一个字符串。 (稍后将详细介绍类型转换器。)
- 对于复杂类型,Web API尝试使用媒体类型从邮件正文中读取值 格式化。
我有一个POST
操作,其中一个string
参数来自用户的输入,因此可以是任何字符 - 外来字符,unicode,撇号,'%20'等等!
因此我不愿意在网址中包含此参数,而[FromBody]
装饰器似乎没有帮助。问题是:将单个字符串参数发布到WebAPI控制器的最佳[ a-hem ]实践是什么?
C#:
[HttpPost]
[Route("api/add")]
public void Add([FromBody]string name)
{
// name is null :(
}
JS:
function add(name: string) {
return this.$http.post("api/add/", name);
}
答案 0 :(得分:1)
如果你真的想要[FromBody]
装饰器,你应该考虑创建一个DTO,这样Model binder就可以从请求体中读取发布的数据并映射到这个DTO对象。
public class MyRequest
{
public string Name { set;get;}
}
[HttpPost]
[Route("api/add")]
public void Add([FromBody]MyRequest model)
{
//do something with model.Name
}
如果您不想创建类,可以从action方法中删除[FromBody]装饰器并保留字符串类型并将值作为查询字符串发送。
public void Add(string model)
{
//do something with model.Name
}
和
$http.post('/api/add?name=Scott with a space')
.then(function(response) {
console.log('angular http response', response.data);
})
答案 1 :(得分:0)
我已经通过使用angular.toJson`包装请求对象(名称)来解决这个问题:
function add(name: string) {
return this.$http.post("api/add/", angular.toJson(name));
}