无法使用 PUT 方法更新行 - MVC 4?

Cannot update row with PUT method - MVC 4?

我有这个方法,如你所见,我修改了它:

[HttpPut]
public HttpResponseMessage PutSIMSData(string langid, byte period, byte year, string data, int userId, SIMSData simsdata)//HttpRequestMessage req)
{
    try
    {
        //SIMSData simsdata = new SIMSData();
        //string jsonContent = req.Content.ReadAsStringAsync().Result;
        //simsdata = JsonConvert.DeserializeObject<SIMSData>(jsonContent);
        //SIMSData simsdata = db.SIMSDataDbSet.Find(langid, period, year);

        if (ModelState.IsValid && 
            simsdata.LanguageID == langid &&
            simsdata.PeriodID == period &&
            simsdata.YearID == year)
        {
            //simsdata.UserID = userId;
            //simsdata.Data = data;
            db.Entry(simsdata).State = EntityState.Modified;
            db.SaveChanges();

            return Request.CreateResponse(HttpStatusCode.OK, simsdata);
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest, simsdata);
        }
    }
    catch (Exception e)
    {
        return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
    }
}

但问题是,我一直收到错误 500,即我正在尝试插入行,其中的组合键已经存在于 table。

我的table是复合键table,3个键,LanguageID,PeriodID,YearID,Data和UserId是应该更新的字段。

我的 ajax 电话是这样的:

updateSIMSDataWithAllParams: function (lang, period, year, data, userId) {
    jq.ajax({
        context: simsDataView,
        contentType: 'application/json; charset=utf-8',
        type: "PUT",
        url: "/api/SIMSData",
        dataType: "json",

        data: JSON.stringify({
            LanguageID: lang,
            PeriodID: period,
            YearID: year,
            Data: data,
            UserID: userId
        }),

        beforeSend: function (jqXHR, settings) {
            simsDataView.setStatusMsg(messages.listingTreeDataMsg, "blue");
        },

        success: function (data, textStatus, jqXHR) {

        },

        error: function (jqXHR, textStatus, errorThrown) {
            errorsMsgTxt.text("SIMS Tree: " + textStatus + ". Error: " + errorThrown + " ");
        }
    });
},

我做错了什么?

我认为您发布的代码是一些尝试的推导,在我看来,它有点令人困惑。

试试这个

[HttpPut]
public HttpResponseMessage PutSIMSData(string langid, byte period, byte year, string data, int userId)
{

    if (ModelState.IsValid)
    {
        try
        {
            SIMSData simsdata = db.SIMSDataDbSet.Find(langid, period, year);

            if(simsdata == null) {
               // entity not found
            }

            // Updating values
            simsdata.UserID = userId;
            simsdata.Data = data;

            db.Entry(simsdata).State = EntityState.Modified;
            db.SaveChanges();

            return Request.CreateResponse(HttpStatusCode.OK, simsdata);
        } 
        catch (Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }

    else
    {
         return Request.CreateResponse(HttpStatusCode.BadRequest, simsdata);
    }
}

Ajax 通话:

updateSIMSDataWithAllParams: function (lang, period, year, data, userId) {
  jq.ajax({
      context: simsDataView,
      contentType: 'application/json; charset=utf-8',
      type: "PUT",
      url: "/api/SIMSData",
      dataType: "json",

      data: JSON.stringify({
          langid: lang,
          period: period,
          year: year,
          data: data,
          userId: userId
      }),

      beforeSend: function (jqXHR, settings) {
          simsDataView.setStatusMsg(messages.listingTreeDataMsg, "blue");
      },

      success: function (data, textStatus, jqXHR) {

      },

      error: function (jqXHR, textStatus, errorThrown) {
          errorsMsgTxt.text("SIMS Tree: " + textStatus + ". Error: " + errorThrown + " ");
      }
  });
},

原来我一直在调用我的 Save/POST 方法而不是我的 Update/PUT 方法。我有一个 AJAX 调用,它获取数据并显示一个保存按钮。当我按下保存按钮时,我获取的数据包含名为 "hasData" 的 属性,当为真时,按下保存按钮将 运行 Update() 函数,如果 "hasData" 是false,按下 Save 按钮将调用我的 Save() 函数。我遇到的错误是,我为此 "hasData" 属性.

检查了错误的 JavaScript 对象

我现在在我的控制器中使用这段代码:

    [HttpPut]
    public HttpResponseMessage PutSIMSData(HttpRequestMessage req)
    {
        try
        {
            SIMSData simsdata = new SIMSData();
            string jsonContent = req.Content.ReadAsStringAsync().Result;
            simsdata = JsonConvert.DeserializeObject<SIMSData>(jsonContent);

            if (ModelState.IsValid)
            {
                db.Entry(simsdata).State = EntityState.Modified;
                db.SaveChanges();

                return Request.CreateResponse(HttpStatusCode.OK, simsdata);
            }
            else
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest, simsdata);
            }
        }
        catch (Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }