我正在尝试将列表传递到Web API,但始终获得空值。我将列表转换为字符串,然后再将其传递给API。如何发送列表到API并正确更新数据?请帮助我找出正确的代码。 类:MatrixProcessData.cs
namespace AHS.IBP.BO
{
[Serializable, DataContract]
public class MatrixProcessData
{
#region Variables
// private int _id;
private int _processYear;
private DateTime _processDate;
#endregion
#region Constructor
public MatrixProcessData()
{
// _id = 0;
_processYear = 0;
_processDate = DateTime.Today;
}
#endregion
#region Properties
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key]
// [DataMember]
//public int ID { get { return _id; } set { _id = value; } }
[DataMember]
public int ProcessYear
{
get { return _processYear; }
set { _processYear = value; }
}
[DataMember]
public DateTime ProcessDate
{
get { return _processDate; }
set { _processDate = value; }
}
#endregion
}
}
调用API的方法:
public void ProcessData()
{
DataSet dsProcessData = new DataSet();
dsProcessData = new TempMatrixClass().GetProcessData(DateTime.Now.Year,771);
List<MatrixProcessData> li = new List<MatrixProcessData>();
if (dsProcessData.Tables[0].Rows.Count > 0)
{
foreach (DataRow dr in dsProcessData.Tables[0].Rows)
{
MatrixProcessData mtrixProcessData = new MatrixProcessData();
mtrixProcessData.ProcessYear = Convert.ToInt32(dr["ProcessYear"]);
mtrixProcessData.ProcessDate = Convert.ToDateTime(dr["ProcessDate"]);
li.Add(mtrixProcessData);
}
string apiUrl = string.Format("{0}api/MatrixProcessData/{1}/", aplilink, 2019);
HttpClient httpClient = new HttpClient();
httpClient.MaxResponseContentBufferSize = 256000;
string strObject = Newtonsoft.Json.JsonConvert.SerializeObject(li, Newtonsoft.Json.Formatting.None);
HttpContent httpContent = new StringContent(strObject, Encoding.UTF8, "application/json");
var response = httpClient.PutAsync(apiUrl, httpContent, new System.Threading.CancellationToken(false)).Result;
if (response != null && response.IsSuccessStatusCode)
{
var data = response.Content.ReadAsStringAsync().Result;
// mtrixProcessData = Newtonsoft.Json.JsonConvert.DeserializeObject<MatrixProcessData>(data);
}
}
}
控制器PUT API方法(列表)为空: MatrixProcessDataController.cs
[Route("{processyear}")]
[ResponseType(typeof(List<MatrixProcessData>))]
public IHttpActionResult PutmatrixProcessData(int processyear, List<MatrixProcessData> matrixProcessData)
{
foreach (var item in matrixProcessData)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Entry(matrixProcessData).State = EntityState.Modified;
if (!matrixProcessDataExists(item.ProcessYear, item.ScenarioID, item.ModuleID, item.MeasureID, item.SKUID, item.ProcessDate))
{
db.MatrixProcessDatas.Add(item);
}
db.SaveChanges();
}
return StatusCode(HttpStatusCode.NoContent);
}
答案 0 :(得分:1)
不确定处理代码是否有其他问题,但是对于控制器代码,您需要指定数据绑定发生的位置,具体取决于发出HTTP请求的方式。您可能需要[FromBody]
or [FromForm]
:
[Route("{processyear}")]
[ResponseType(typeof(List<MatrixProcessData>))]
public IHttpActionResult PutmatrixProcessData([FromRoute]int processyear, [FromBody] List<MatrixProcessData> matrixProcessData)
{
...
}