Как передать объект List в метод Web API PUT C # - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь передать List в мой 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);
            }

        }
    }

Метод API PUT контроллера (список) получает значение null: 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);
    }

1 Ответ

1 голос
/ 14 марта 2019

Не уверен, если у вас есть какие-либо другие проблемы с вашим кодом обработки, но для кода контроллера вам нужно указать, где происходит привязка данных, в зависимости от того, как вы делаете HTTP-запрос. Вам может понадобиться [FromBody] или [FromForm]:

[Route("{processyear}")]
[ResponseType(typeof(List<MatrixProcessData>))]
public IHttpActionResult PutmatrixProcessData([FromRoute]int processyear, [FromBody] List<MatrixProcessData> matrixProcessData)
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...