2014-12-31 66 views
2

我的javascript代码:我的C#代码如何正确发送PUT请求到webAPI应用程序?

$.ajax({ 
     type: "PUT", 
     url: "/api/WordsAPI/"+wordData.ID, 
     data: { word: wordData} 
    }); 

部分:

// PUT: api/WordsAPI/5 
    [ResponseType(typeof(void))] 
    public IHttpActionResult PutWord(int id, Word word) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     if (id != word.ID) 
     { 
      return BadRequest(); 
     } 

     [...] 
    } 

在VisualStudio中调试程序,我可以看到应用程序执行第二错误请求。服务器端变量“word”中的所有数据均为空。我不知道为什么。 “id”变量是可以的,它存储正确的ID。

在Firefox的JavaScript调试器中,一切似乎都没有问题。 wordData不为空(wordData.id正确发送到服务器),我可以看到所有数据都成功发送到服务器。

什么可能是错的?我该怎么办?

编辑:

在Firefox请求(这是由浏览器发送): enter image description here

+0

应该工作..尝试改变'数据:{字:wordData}''到的数据:JSON.stringify(wordData )'并确保你的'wordData'与'Word word'具有相同的属性 –

+0

你也可以用'[FromBody]'属性标记'word' –

+0

我不确定“wordData是否具有与Word字相同的属性”。我的意思是:在Word类中,我有一个包含DateTime值的属性。在我的应用程序中,我将Word变量发送给客户端,客户端修改此数据并将其发送回服务器。我怀疑“DateTime”属性实际上是服务器端的“字符串”。那我该怎么办? – Piotrek

回答

2

服务器端代码对我来说工作正常。 但是,JavaScript应如下所示。

$.ajax({ 
     type: "PUT", 
     url: "/api/WordsAPI/"+wordData.ID, 
     data: wordData 
}); 

我假设wordDataObject与样本定义

var wordData = { 
    ID: 5, 
    UsersLanguage: "string data" 
    // etc 
} 
1

我梅耶同意您需要添加[FromBody]标签在Word类的前面API方法肯定。其次,Simoco说你需要确保你发送的wordData与你的Word模型具有相同的结构。

这意味着,如果你的类看起来像这样

public class Word{ 
int id {get; set;} 
string someText {get; set;} 
} 

然后下你的话是从JavaScript的发送需要具有相同的结构

var word = {id : 1, someText: "text string"}; 

我也建议您在VS调试上确保被调用的方法。如果将鼠标悬停在Word参数上,可以看到正在拾取的内容。

+0

1.我已经添加[FromBody]仍然不起作用。 2.不要ModelState.IsValid检查?如果是的话,它似乎是模型是好的... ... - – Piotrek

相关问题