C# 带有枚举原因的Wcf DataContract类';枚举值'-1';对于“类型”无效;错误

C# 带有枚举原因的Wcf DataContract类';枚举值'-1';对于“类型”无效;错误,c#,wcf,datacontractserializer,C#,Wcf,Datacontractserializer,我在尝试通过wcf传递对象时遇到以下异常: 尝试序列化参数时出错。InnerException消息为“枚举值”-1对于类型“Models.SubModels.DamageLocations”无效,无法序列化。如果类型具有DataContractAttribute属性,请确保存在必要的枚举值并用EnumMemberAttribute属性标记。“。有关更多详细信息,请参阅InnerException 它的定义如下: [DataContract] public class Property {

我在尝试通过wcf传递对象时遇到以下异常:

尝试序列化参数时出错。InnerException消息为“枚举值”-1对于类型“Models.SubModels.DamageLocations”无效,无法序列化。如果类型具有DataContractAttribute属性,请确保存在必要的枚举值并用EnumMemberAttribute属性标记。“。有关更多详细信息,请参阅InnerException

它的定义如下:

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

    public Property()
    {
        this.Damage = new 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来自post数据,这是来自提交页面的post数据

Damage.DamageLocation=-1

enum DamageLocations{…}
更改为
enum DamageLocations:int
然后重试。

听起来您的数据的值为-1

枚举只是一个奇特的整数。可以将任何值指定给枚举(在基础类型的范围内);例如:

enum Foo { Bar = 1 }
...
Foo foo = (Foo)1035; // perfectly fine
这在c#中很好,但在大多数序列化库中却不行,尤其是那些希望将其编码为名称的库(XmlSerializer、DataContractSerializer等)


因此:如果-1不是枚举中定义的值,请不要在数据中使用该值。如果-1有意义,请在枚举中定义它。

是传递有效枚举的字段值吗?你能试着在前面和后面添加值吗?它接收到的值是多少?我猜可能有人正在使用-1作为“未知/其他/所有/无/其他东西”@TomislavMarkovski是的,我尝试过设置值。请参见编辑。但也有相同的错误。@MarcGravel在wcf调用点处,枚举的值是-1,正如错误所述,该属性没有在ctor中设置,而是具有默认值。这不应该是0,而不是-1吗?请显示引发异常的代码。当您将
return new Property()
放在服务方法中时会发生什么情况?这是默认设置;这应该是完全不可能的difference@Pramod这没什么区别。谢谢。我想你是对的,-1来自一个mvc http post请求。所以现在我想我要确保模型绑定器将-1枚举设置为0。。。这听起来对吗?@asawyer这是否“对”取决于你;如果这就是你想要a-1做的,那么肯定是好的一点!在这里可以找到自定义活页夹的快速编辑,将-1更改为0,并使其正常工作。非常感谢您的时间和帮助,非常感谢。但是在我的例子中,如果我添加一个值为-1的枚举成员,我将得到这个错误<代码>公共枚举损坏位置{[EnumMember]无=-1,[EnumMember]未知=1,[EnumMember]前=2,[EnumMember]后=3}
。那么我该如何处理这种情况呢?