2012-11-12 82 views
2

我見過很多類似的問題,我嘗試了所有可能的答案,但我的問題仍然是相同的。基本上,我有以下ajax電話。參數爲空

var obj = { 
    Duration: 12000, 
    Errors: 2 
}; 
var post = $.ajax({ 
    url: APIUrl, 
    data: JSON.stringify(obj), 
    type: "POST", 
    cache: false, 
    dataType: 'json', 
    contentType: 'application/json, charset=utf-8' 
}); 

這是我的視圖模型。

public class TargetBasedViewModel 
{ 
    public int Duration{ get; set; } 
    public int Errors{ get; set; } 
} 

這裏是我的控制器。

[HttpPost] 
    public HttpResponseMessage Post(TargetBasedViewModel test) 
    { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

問題是該參數保持爲空。 我已經使用Fiddler來檢查請求,它看起來很好,所有的屬性都在那裏,我甚至可以檢查JSON對象,並確保我的值實際上被髮送到服務器。我已經閱讀了很多文章,甚至試圖將[ModelBinder]和[FromBody]添加到參數中,但仍然沒有運氣。 我也試圖加入到我的Application_Start()

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); 

任何想法我可能是做錯了?

+1

我假設你的問題是控制器方法正在被調用,它只是一個空參數?你可以看看控制器認爲發佈的數據是什麼樣的。 –

+0

是的,我實際上在控制器的開始處有一個斷點,一切都加載正常,除非我一直在參數中獲得一個空值。我希望能夠「檢查」控制器請求中的內容,但序列化程序或模型聯編程序應該負責創建我定義的類的實例。換句話說,我不知道如何檢查控制器中的其他內容,現在我只使用Fiddler,請求看起來很好。 – And

+0

如果你看看ControllerContext,你可以進入HttpContext並從那裏到HttpRequest。然後您可以查看Form集合或QueryString集合。既然你發佈了,我認爲你的數據應該可以在Form集合中找到,但由於你沒有使用序列化表單,我不確定會傳達什麼。 –

回答

0

您可能會看到this post和接受的答案。它暗示:

  1. 爲了發佈,你需要設置的形式的形式;
  2. 您需要刪除dataType和contentType參數。

我想我已經知道了!您的contentType參數:

它必須是 「應用/ JSON的;字符集= UTF-8」

你已經得到了 「JSON」 之後的逗號。

+0

謝謝@AnnL,我之前將它作爲序列化表單工作,但我想發佈一個純JSON,因此JSON.Stringify。我在其他問題上看到的其他實現可以很好地使用JSON序列化。 – And

+0

你能鏈接到你模擬的例子嗎?也許我們[讀者]可以發現差異。像,你確定這些例子包括一個POST? –

+0

好的,這裏是一個很好的例子,您可以看到數據不是來自表單,而只是一個JavaScript對象。 [鏈接](http://code.msdn.microsoft.com/Post-Data-to-MVC-4-WEB-API-80386405) – And

0

檢查控制器上的ModelState屬性。在那裏記錄反序列化錯誤。你可能會發現爲什麼反序列化失敗。

+0

儘管屬性是基本類型並且名稱相同,但很可能在反序列化中存在錯誤。但是我沒有收到任何通知。明天早上我會按照你的建議。謝謝! – And

+0

我檢查了ModelState.IsValid,它返回true。我設法在參數之前使用[ModelBinder]註釋獲取模型的實例,但屬性設置爲零。也就是說,當我發佈數據時,出於某種原因,這些值被丟棄,並且使用具有「空」值的屬性創建新實例,在int屬性的情況下,這是一個零值。我感覺我正在接近... – And