2017-08-04 14 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

は、私は私の更新/ PUTメソッドの代わりに私の保存/ POSTメソッドのすべての時間を呼び出してきたが判明します。私はデータを取得し、保存ボタンを表示するAJAX呼び出しを持っています。 Saveボタンを押すと、取得したデータに「hasData」というプロパティがあり、Trueの場合はSaveボタンを押し、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); 
     } 
    } 
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 + " "); 
     } 
    }); 
}, 
関連する問題