【问题标题】:How to Pass List object to Web API PUT method C#如何将列表对象传递给 Web API PUT 方法 C#
【发布时间】:2019-03-14 16:03:54
【问题描述】:

我正在尝试将一个列表传递给我的 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);
    }

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api


    【解决方案1】:

    不确定您的处理代码是否有任何其他问题,但对于控制器代码,您需要指定数据绑定发生的位置,具体取决于您发出 HTTP 请求的方式。你可能需要[FromBody] or [FromForm]:

    [Route("{processyear}")]
    [ResponseType(typeof(List<MatrixProcessData>))]
    public IHttpActionResult PutmatrixProcessData([FromRoute]int processyear, [FromBody] List<MatrixProcessData> matrixProcessData)
    {
        ...
    }
    

    【讨论】:

    • @user3510330 为什么?你的 HTTP 请求是什么?MatrixProcessData 类的结构是什么?
    • 命名空间 AHS.IBP.BO { [Serializable, DataContract] public class MatrixProcessData { #region Variables // private int _id;私人int _processYear; #endregion #region 构造函数 public MatrixProcessData() { // _id = 0; _processYear = 0; _processDate = DateTime.Today; } #endregion #region 属性 [DatabaseGenerated(DatabaseGeneratedOption.None)] [Key] // [DataMember]
    • @user3510330 请编辑您的问题并添加类声明和 HTTP 请求正文。
    • 类结构不是列表类型。
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多