WebApi 2 POST使用单个字符串参数而不是wokring

Dan*_*nny 29 javascript c# asp.net-web-api asp.net-web-api2

我有以下控制器:

public class ValuesController : ApiController
{
    // POST api/values
    public IHttpActionResult Post(string filterName)
    {
        return new JsonResult<string>(filterName, new JsonSerializerSettings(), Encoding.UTF8, this);

    }
}
Run Code Online (Sandbox Code Playgroud)

WebApi配置

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional });
Run Code Online (Sandbox Code Playgroud)

我使用这个js代码来调用api

$.ajax(
{
    url: "/api/values/",
    type: "POST",
    dataType: 'json',
    data: { filterName: "Dirty Deeds" },
    success: function (result) {
        console.log(result);
    },
    error: function (xhr, status, p3, p4) {
        var err = "Error " + " " + status + " " + p3;
        if (xhr.responseText && xhr.responseText[0] == "{")
            err = JSON.parse(xhr.responseText).message;
        console.log(err);
    }
});
Run Code Online (Sandbox Code Playgroud)

我得到405方法不允许(帖子)

有任何想法吗?

Igo*_*gor 32

C#

public class ValuesController : ApiController
{
    // POST api/values
    [HttpPost] // added attribute
    public IHttpActionResult Post([FromBody] string filterName) // added FromBody as this is how you are sending the data
    {
        return new JsonResult<string>(filterName, new JsonSerializerSettings(), Encoding.UTF8, this);
    }
Run Code Online (Sandbox Code Playgroud)

JavaScript的

$.ajax(
{
    url: "/api/Values/", // be consistent and case the route the same as the ApiController
    type: "POST",
    dataType: 'json',
    data: "=Dirty Deeds", // add an = sign
    success: function (result) {
        console.log(result);
    },
    error: function (xhr, status, p3, p4) {
        var err = "Error " + " " + status + " " + p3;
        if (xhr.responseText && xhr.responseText[0] == "{")
            err = JSON.parse(xhr.responseText).message;
        console.log(err);
    }
});
Run Code Online (Sandbox Code Playgroud)

说明

因为您只发送一个值,所以在它前面添加=符号,因此它将被视为表单编码.如果要明确这是您正在对ajax调用执行的操作,还可以添加内容类型.

contentType: 'application/x-www-form-urlencoded'
Run Code Online (Sandbox Code Playgroud)

或者,您也可以通过URL发送内容或将内容包装在服务器上的对象以及ajax调用中并对其进行字符串化.

public class Filter {
    public string FilterName {get;set;}
}

public class ValuesController : ApiController
{
    // POST api/values
    [HttpPost] // added attribute
    public IHttpActionResult Post([FromBody] Filter filter) // added FromBody as this is how you are sending the data
    {
        return new JsonResult<string>(filter.FilterName, new JsonSerializerSettings(), Encoding.UTF8, this);
    }
Run Code Online (Sandbox Code Playgroud)

JavaScript的

$.ajax(
{
    url: "/api/Values/", // be consistent and case the route the same as the ApiController
    type: "POST",
    dataType: 'json',
    contentType: 'application/json',
    data: JSON.stringify({FilterName: "Dirty Deeds"}), // send as json
    success: function (result) {
        console.log(result);
    },
    error: function (xhr, status, p3, p4) {
        var err = "Error " + " " + status + " " + p3;
        if (xhr.responseText && xhr.responseText[0] == "{")
            err = JSON.parse(xhr.responseText).message;
        console.log(err);
    }
});
Run Code Online (Sandbox Code Playgroud)


mis*_*sha 9

添加[FromBody]到API方法签名,public IHttpActionResult Post([FromBody]string filterName)并用引号包装ajax数据参数:data: '"' + bodyContent + '"'.

不是很直观,但它有效.

  • @SachinPakale只需更改参数类型即可.(`int filterNumber`).`Controller`应该自动将传递的值转换为`String` (2认同)