Skip to main content
 首页 » 编程设计

c#之Web API之复杂类型枚举的表单编码输入允许无效值

2024年08月06日51dudu

我有一个具有许多属性的复杂类型,其中一个是枚举。将数据(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 
} 

然后检查您的输入是否有效。