发布请求后未填写ASP.NET Web API对象参数

时间:2019-02-15 19:55:41

标签: c# asp.net api http post

我正在尝试建立一个小型ASP.NET Web API项目,以便可以将数据从一个小型React.JS项目发布到数据库中。我尝试了许多解决方案,但结果毫无意义,我也不知道如何解决它。

我有一个非常简单的模型:

public class Hour
{
        public int WeekID { get; set; }
}

这是我的控制器

[HttpPost]
public IHttpActionResult AddHour(Hour hour)
{      
     return Ok();
}

这是我用来发布数据的方法

export const SaveWeek = weekData=> {
  const headers = new Headers();
  headers.append("Content-Type", "application/json");

  const Week= {
    method: "POST",
    headers,
    mode: "cors",
    body: weekData
  };

  console.log("Hours:");

  // Returns {"WeekID": 1}
  console.log(Hours.body);

  return axios.post("http://localhost:52350/api/REST/AddHour", {
    Week
  });
};

我在React中调用此SaveWeek方法的方式是:

// The JSON parameter is for testing hard coded to: {"WeekID": 1}
handleSave = async json => {
    const data = await SaveWeek(json);

    console.log(data);

     this.closeModal();
};

我知道axios POST请求有效,我测试的方式是通过更改方法以不使用任何参数并查看接收到的结果:

[HttpPost]
 public IHttpActionResult AddHour(Hour hour)
 {
   // This returns a string in which the data that I sent
   // can be found.
    string body = Request.Content.ReadAsStringAsync().Result;

     return Ok();
 }

奇怪的是,当方法不包含任何参数时,主体将被数据填充,但是当我为方法提供带有Hour对象参数的主体时,主体将是一个空字符串(“”)。而且Hour对象参数也不会填充我提供的值。

我在这里做什么错了?

2 个答案:

答案 0 :(得分:2)

根据https://github.com/axios/axios#axiosposturl-data-config axios.post具有以下签名

axios.post(url[, data[, config]])

所以您只需要将请求更改为

export const SaveWeek = weekData => {
    //headers should be simple object, not Headers
    const headers = {
        "Content-Type": "application/json"
    };

    //removed body, because we pass data as second parameter
    //removed method, because 'axios.post' implies using "post" method
    const Config = {
        headers,
        mode: "cors"
    };

    const url = "http://localhost:52350/api/REST/AddHour";
    return axios.post(url, weekData, Config);
}

答案 1 :(得分:2)

对ASP.Net Web API管道的传入请求被读取为超高速的仅向前流。一旦读取,便无法再次读取。

 [HttpPost]
 public IHttpActionResult AddHour(Hour hour)
 { 
   // With model binding 
   // use hour.WeekID 
 }

在此第一个示例中,模型绑定已经完成,一旦被读取,就无法再次读取。因此,Request.Content之后将为空。

     [HttpPost]
     public IHttpActionResult AddHour()
     {
       // Without model binding
       // use Request.Content
     }

在第二个示例中,它不使用模型绑定,因此仍然填充了Request.Content属性。

使用一个或另一个(不要同时使用),不要将MVC模型绑定的工作方式不同。

此博客文章中提供了更好的解释 http://www.hackered.co.uk/articles/asp-net-web-api-why-is-the-request-Content-empty-when-the-model-is-populated