我有一个具有许多属性的复杂类型,其中一个是枚举。将数据(application/x-www-form-urlencoded)放入将此类型作为参数的 Web API 方法时,它似乎允许为枚举属性的值传递任何字符串值。如果传递的值是枚举的成员之一,它会正确分配值,但如果传递的值无效,它只会分配枚举的第一个成员。
描述问题的简单示例 - 给定模型类:
public enum EdibleFarmAnimal {
Sheep = 0,
Cow = 1,
Chicken = 2
}
public class ExampleModel {
public EdibleFarmAnimal EatThis { get; set; }
public string AnotherIrrelevantProperty { get; set; }
}
...和网络 API 方法:
[HttpPut]
[ActionName("Put")]
public void Put(long id, ExampleModel model) {
// Do something with the model
}
如果我将 EatThis=Cow&AnotherIrrelevantProperty=cheese 放入相关 URL,它会按预期工作,并且 model.EatThis 等于 EdibleFarmAnimal.Cow,但是如果我 PUT EatThis=Horse&AnotherIrrelevantProperty= cheese 然后将 model.EatThis 设置为 EdibleFarmAnimal.Sheep,而我希望(并期望)抛出某种错误,因为输入对于它被反序列化为的类型无效。
请您参考如下方法:
Enum在C#中有一个默认值0,所以当它不能解析你的输入时,它默认为0代表对于枚举中的 Sheep ( msdn article on this )。
您可以做的是创建一个 Invalid 枚举元素并将其分配给 0:
public enum EdibleFarmAnimal {
Invalid = 0,
Sheep = 1,
Cow = 2,
Chicken = 3
}
然后检查您的输入是否有效。
