2012-01-18 152 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