2017-08-04 51 views
1

我有这样的方法,你可以看到我修改了它:无法使用PUT方法更新行 - 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,即我试图与已经存在于表组合键插入一行。

我的表是一个组合键表,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 + " "); 
     } 
    }); 
}, 

我到底做错了什么?

+0

当您使用'simsdata = db.SIMSDataDbSet.Find(LANGID,周期,一年)什么appens;'?另外我不明白为什么'simsdata'是函数的参数。 – OmarMuscatello

+0

你的'if'块永远不会被执行('langid','period'和'year'的值,并且将永远是它们的默认值,因为你永远不会为它们发送值) –

+0

你是什么意思我不发送他们,检查ajax调用,数据对象 – Vlad

回答

0

原来我一直打电话给我保存/ POST方法的所有时间,而不是我的更新/ PUT方法。我有一个获取数据的AJAX调用,它显示一个Save按钮。当我按下我的保存按钮时,我获取的数据包含名为“hasData”的属性,当true时,按保存按钮将运行Update()函数,如果“hasData”为false,按保存按钮将调用我的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); 
     } 
    } 
0

我认为你发布的代码是一些尝试的推导,并且从我的观点来看,这有点令人困惑。

试试这个

[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 + " "); 
     } 
    }); 
},