2011-08-26 50 views
1

我從我的網頁發送了一個AJAX調用,將以下數據發送到我的MVC3操作方法。MVC3模型綁定器綁定到小數而不是int的問題

{ 
    "name":"Test", 
    "newitems":[ 
    {"id":15,"amount":100,"unit":"gram"}, 
    {"id":1,"amount":75,"unit":"gram"}, 
    {"id":46,"amount":25,"unit":"gram"} 
    ] 
} 

在我的控制,我有以下類別:

public class NewDataItem 
{ 
    public string name { get; set; } 
    public List<NewDataItemDetails> newitems { get; set; } 
} 

public class NewDataItemDetails 
{ 
    public int id { get; set; } 
    public int amount { get; set; } 
    public string unit { get; set; } 
} 

而接收到請求的操作方法有NewDataItem作爲參數。這是完美的,但是NewDataItemDetails的amount屬性可能並不總是包含int。例如它可能是50.45。因此,我將public int amount { get; set; }更改爲public decimal amount { get; set; }

之後該變化量始終顯示爲0,而不是它做時,它是一個int適當的值。

爲什麼MVC未能價值時,它是一個小數,當它的工作只是罰款爲int的屬性綁定?

+0

複製的[這一個](http://stackoverflow.com/questions/5698984/default-asp-net-mvc-3-model-binder-doesnt-bind -decimal-propeties)? – Sumo

+0

對於所有輸入值,例如「5」或「5.00」,是否爲0? –

+0

@Sumo - 關閉,但我沒有完全相同的問題ryudice得到它的工作,例如5.00,但是我在5和5.00都得到同樣的問題。 –

回答

1

我發現了這個問題。

如果我改變線"amount":100,"amount":"100",它工作正常。看起來,MVC ModelBinder可以管理字符串到十進制的轉換,但不是int到decimal。

0

您的類型(類)NewDataItemDetails屬性的數量類型爲int。

您正在使事情難以管理。如果您最終希望將金額作爲小數進行計算,則會簡化爲實際將金額類型用作小數。

這樣可以避免讓您擴展默認的模型綁定器並滿足您的行爲。

我認爲,這是明智的,它simplies的發送量在Ajax調用小數。它提供了一致性。

+0

如何在ajax調用中將它作爲小數發送? JavaScript不區分整數和小數。這只是JavaScript的數字。 –

+0

關鍵是我想在我的課堂中將該屬性作爲小數,但目前無法使用。這就是爲什麼它目前是一個整數。但好消息是......我解決了問題:)查看我的答案瞭解詳情。 –

+0

是的,它會工作,因爲你改變金額爲十進制。 :) – Neelesh

0

我知道我這個有點晚了,但有沒有哪直到MVC修復它(我相信這是在其末端)改變任何工作的另一個解決方案。

在我的javascript我添加0.00001到我的價值,如果它應該是一個小數,但是是一個整數。對於那些我知道的應該是貨幣價值的人,我知道這沒有任何作用,並且會下降。對於那些我不知道它們的值並且這可能會影響它的人,我會在綁定mvc後從值中刪除0.00001。該綁定正常工作,因爲這不再是一個整數在mvc眼睛

+1

當我可以將括號放在上面時,似乎是一種不必要的破解。 –

0

如果你不想改變模型聯編程序,那麼你可以創建JSON對象,並將數量轉換爲字符串。它會工作對我罰款。

var test={"amount":""}; 
var test1={"amount":100} 
test.amount=test1.amount.toString();