QueryString未正确解析

时间:2011-12-27 14:14:04

标签: c# asp.net asp.net-mvc-3 exception-handling query-string

我有一个请求我在控制器中的一个动作,它期望枚举作为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)'。可选参数必须是引用类型,可空类型,或者声明为可选参数。

     

参数名称:参数

     

请求网址:http://myawesomeurl.local/app/My/GetContent?abc=a_123&xyz=434&enumVar=EnumValue&teamId=a_123&a=0&b=1&c=3&qwerty=123&token=234234231

     

请求路径:app / My / GetContent

如果您需要更多信息,请与我们联系。我不确定如何处理这个问题。

更新: 我的Enum定义:

public enum DisplayMode
{
    EnumValue,
    EnumValue1,
    EnumValue2
}

另外我应该提一下,请求有时会失败,而不是总是这样,这是不一致的。这是我们的异常db中记录的错误。

2 个答案:

答案 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提供。