Web API HttpPost主体,带有空格和引号

时间:2014-04-10 18:00:28

标签: asp.net asp.net-mvc asp.net-web-api asp.net-mvc-5

我想创建一个HttpPost控制器方法,该方法接受一个字符串,该字符串可能包含空格或单引号。我现在的代码如下:

[HttpPost]
[Route("ValidateExpression")]
public bool ValidateExpression([FromBody] string testExpression )
{
    // ...
}

我通过JS(Angular)发布它,如:

$http.post(myRootUrl +'ValidateExpression', "'token1' || 'token2'");

我可以浏览JS并看到测试表达式是我所期望的,并且它在传出帖子的主体中看起来也很好(如Fiddler& Firebug中所见)。但是当我在服务器端的ValidateExpression的第一行中断点时,testExpression被截断到第一个空格,并且被删除了引号,所以我收到的是token1

如何避免这种不必要的转变?

我想我可以创建一个模型来包装单个字符串,并将我的字符串作为字段值发送到与模型匹配的JSON对象中......或者我可以对字符串进行一些转义,但第一个看起来很难看/不必要的,第二个似乎是我试图破解我不太了解的行为。

1 个答案:

答案 0 :(得分:1)

您需要使用等于参数名称的密钥传递JSON对象。

// POST api/values
public string Post(string value) {
  return value;
}

$.post('/api/values', { value: 'Dave' });

或者,您可以通过以下方式满足Web API的编码要求:

$.post('api/values', "=" + value);

$.post('api/values', { '': value });

此处提供更多信息:http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

编辑:

另外,请注意angualrjs http.post和jquery.post的行为有所不同:

  

区别在于jQuery和AngularJS如何序列化和传输   数据。从根本上说,问题在于您的服务器语言   选择无法理解AngularJS的传输   本地 - 这是一个耻辱,因为AngularJS当然没有做   哪里不对了。默认情况下,jQuery使用Content-Type传输数据:   x-www-form-urlencoded和熟悉的foo = bar& baz = moe序列化。   但是,AngularJS使用Content-Type传输数据:   application / json和{" foo":" bar"," baz":" moe" JSON   序列化,遗憾的是一些Web服务器语言 - 特别是   PHP-不要原生地反序列化。

     

http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/