2012-11-16 51 views
1

使用ASP.NET MVC 3,我正在做一個jQuery(ver 1.7.1)AJAX調用,就像我已經做了十億次。但是,我注意到了一些奇怪的東西。 以下調用工作正常jQuery AJAX - 數據參數空白在控制器

// license object 
var license = { 
    City: "New York", 
    CompanyID: 1, 
    County: "N/A", 
    IsActive: true 
}; 
// make the request 
var $req = $.post('/License/theLicense', license); 
$req.success(function() { 
    // this works! 
}); 


[HttpPost] 
public void Save(License theLicense) 
{ 
    // save 
} 

然而,當我指定控制器不會在控制器寄存器中的數據參數

// license object 
var license = { 
    City: "New York", 
    CompanyID: 1, 
    County: "N/A", 
    IsActive: true 
}; 
// make the request 
// this time the controller parameter is specified 
// the object will be blank at the server 
var $req = $.post('/License/theLicense', { theLicense: license }); 
$req.success(function() { 
    // this does not work 
}); 

目的是在空白控制器如下所示

enter image description here

這很煩人,因爲我需要傳遞另一個數據參數,但我不能因這個問題。

NOTE: JSON與POCO相同。

爲什麼當我指定數據參數時,對象在控制器上顯示爲空白,但是當我沒有時它就好了?

+2

可以向下選民實際上是在爲什麼評論他們投下了票?這有點荒謬。我花了很多時間來解決這個問題。 –

回答

3

有時POCO解串器獲取奇怪的原因抓獲。我在我的JSON對象與POCO完全匹配的地方看過它,它仍然不會反序列化。

發生這種情況時,我通常會將對象作爲JSON字符串發送到服務器,然後在服務器上反序列化它。我個人使用ServiceStack.Text是因爲它是最快的。

所以,你的jQuery會是這樣的:

var license = { 
    City: "New York", 
    CompanyID: 1, 
    County: "N/A", 
    IsActive: true 
}; 

var $req = $.post('/License/theLicense', JSON.stringify(license)); 

那麼你的控制器將採取在一個字符串參數(JSON)反序列化對象:

[HttpPost] 
    public void Save(string json) 
    { 
     License theLicense = JsonSerializer<License>.DeserializeJsonString(json); 
     // save 
    } 
1

發生這種情況是因爲您發送的對象包含許可證作爲成員,但控制器期望得到License對象。

您必須聲明的包裝類爲您的數據是這樣的:

public Class MyWrapperClass 
    { 
     public License theLicense; 
     //declare other extra properties here 
    } 

和控制器:

[HttpPost] 
public void Save(MyWrapperClass thewrraper) 
{ 
    var license = thewrapper.theLicense; 
    // save 
} 

編輯: 嘗試圍繞你的JSON對象的成員與quotations.eg( {"theLicense": license }

+0

我喜歡這個解決方案,但是我的許可證類在包裝類中仍然是空白的。 –

+1

你確定json和POCO完全一樣嗎? –

+0

將FormCollection作爲參數放入控制器操作中,並檢查來自客戶端的正確數據是否正確? –

0

試試這個:

JS:

// license object 
var license = { 
    City: "New York", 
    CompanyID: 1, 
    County: "N/A", 
    IsActive: true 
}; 

var $req = $.post('/License/Save', { theLicense: license }); 
$req.success(function() { 
    // this does not work 
}); 

.NET

public class LicenseController: Controller 
{ 
    ... 

    [HttpPost] 
    public void Save(License theLicense) 
    { 
     // save 
    } 

    ... 
} 
+0

這正是我正在做的,它不工作... –