2012-01-18 151 views
3

我得到以下異常試圖通過WCF傳遞對象:與枚舉原因WCF DataContract類「「枚舉值‘-1’是類型無效」錯誤

有試圖序列化錯誤參數http://tempuri.org/:item。 InnerException消息是'枚舉值'-1'對'Models.SubModels.DamageLocations'類型無效,無法序列化。如果類型具有DataContractAttribute屬性,請確保存在必要的枚舉值並使用EnumMemberAttribute屬性標記''。有關更多詳細信息,請參閱InnerException。

它的定義是這樣的:

[DataContract] 
public class Property 
{ 
    [DataMember] 
    public PropertyDamage Damage { get; set; } 

    public Property() 
    { 
     this.Damage = new PropertyDamage(); 
    } 
} 

而且PropertyDamage

[DataContract] 
public enum DamageLocations 
{ 
    [EnumMember] 
    Unknown=0, 
    [EnumMember] 
    Front, 
    [EnumMember] 
    Rear 
} 

[DataContract] 
public class PropertyDamage 
{ 
    [Display(Name="Location of Damage:")] 
    [DataMember(IsRequired=true)] 
    public DamageLocations DamageLocation { get; set; } 
} 

編輯 - 這也導致了同樣的錯誤:

public enum DamageLocations 
{ 
    Unknown=0, 
    Front=1, 
    Rear=2 
} 

編輯2 - 添加了一個默認值ctor中的枚舉沒有改變錯誤:

public PropertyDamage() 
    { 
     this.DamageLocation = DamageLocations.Unknown; //0 
    } 

試圖研究這個問題,我看到人們得到一個類似的錯誤「枚舉值'0'是無效的」,並且解決方案是將一個0添加到枚舉。

雖然我已經有一個0項,並且錯誤狀態-1是無效的。

解決此問題的正確方法是什麼?

edit3 - 看起來-1是來自帖子數據,這是提交頁面的帖子數據。

Damage.DamageLocation=-1 
+0

是你傳遞一個有效的枚舉的字段值?你可以嘗試向前後添加值嗎? – 2012-01-18 16:27:48

+0

它收到的價值是多少?我的猜測是有人使用-1作爲「未知/其他/所有/沒有/某事 - 其他」 – 2012-01-18 16:29:28

+0

@TomislavMarkovski是的,我試圖設置值。請參閱編輯。雖然同樣的錯誤。 – asawyer 2012-01-18 16:29:33

回答

6

聽起來就像你的數據的值爲-1。

枚舉只是奇特的整數。您可以將任何值分配給枚舉(在基礎類型的範圍內);例如:

enum Foo { Bar = 1 } 
... 
Foo foo = (Foo)1035; // perfectly fine 

這是在C#罰款,但在大多數的序列化庫,特別是那些想要將其編碼爲名稱(XmlSerializer的,DataContractSerializer的,等等)。因此:如果-1不是定義的您的枚舉的值,請不要在您的數據中使用該值。如果-1有含義,請在枚舉中定義它。

+0

我認爲你是正確的,-1來自mvc http post請求。所以現在我想我確保模型綁定器將-1枚舉設置爲0 ...聽起來是對的嗎? – asawyer 2012-01-18 16:48:23

+1

@asawyer這是否「正確」取決於你;如果這是你想要的-1,那麼確定 – 2012-01-18 16:51:22

+0

好點!在這裏http://stackoverflow.com/a/6099687/426894找到自定義聯編程序的快速編輯,將-1改爲0並正常工作。感謝您的時間和幫助,非常感謝。 – asawyer 2012-01-18 16:57:01

0

變化enum DamageLocations{...}enum DamageLocations:int然後再試。

+0

這是默認值;這應該完全沒有區別 – 2012-01-18 16:39:57

+0

@Pramod這沒有什麼區別。謝謝你。 – asawyer 2012-01-18 16:41:02