我有一个请求我在控制器中的一个动作,它期望枚举作为Querystring中的一个键。我可以看到在QueryString中设置相同,但是服务器抛出了一个异常,说明没有设置相同的错误:
参数字典包含非可空类型参数'enumVar'的空条目。
被抛出。
以下是例外情况:
异常类型:System.ArgumentException
异常消息:参数字典包含方法'System.Web.Mvc.ActionResult GetContent(Int64,NameSpace.Enums.MyEnum)的非可空类型'NameSpace.Enums.MyEnum'的参数'enumVar'的空条目。 'NameSpace.Controllers.MyController'中的System.String,Int32,Int32,Int32,Int32,Int64)'。可选参数必须是引用类型,可空类型,或者声明为可选参数。
参数名称:参数
请求路径:app / My / GetContent
如果您需要更多信息,请与我们联系。我不确定如何处理这个问题。
更新: 我的Enum定义:
public enum DisplayMode
{
EnumValue,
EnumValue1,
EnumValue2
}
另外我应该提一下,请求有时会失败,而不是总是这样,这是不一致的。这是我们的异常db中记录的错误。
答案 0 :(得分:4)
action
。 MVC将实际的控制器操作方法名称放在那里,无论您在查询字符串或表单中有什么(假设您在路由中使用{action}
段)。路由变量优先于所有内容,因此如果您碰巧尝试使用保留的参数名称绑定Enum,则只需就不会出现。
答案 1 :(得分:1)
看起来默认模型Binder并未涉及枚举。您最好的选择是继承DefaultModelBinder
类并处理属性为枚举的场景。
public class U413ModelBinder : DefaultModelBinder
{
/// <summary>
/// Fix for the default model binder's failure to decode enum types when binding to JSON.
/// </summary>
protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext,
PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
{
var propertyType = propertyDescriptor.PropertyType;
if (propertyType.IsEnum)
{
var providerValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (null != providerValue)
{
var value = providerValue.RawValue;
if (null != value)
{
var valueType = value.GetType();
if (!valueType.IsEnum)
{
return Enum.ToObject(propertyType, value);
}
}
}
}
return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
}
}
代码和逻辑由this question提供。