QueryString не анализируется правильно - PullRequest
2 голосов
/ 27 декабря 2011

У меня есть запрос к одному из моих действий в контроллере, который ожидает перечисление в качестве ключа в строке запроса. Я вижу, что то же самое установлено в QueryString, но сервер выдает исключение, говоря, что то же самое не установлено, и ошибка:

Словарь параметров содержит пустую запись для параметра 'enumVar' ненулевого типа.

брошено.

Вот подробности исключения:

Тип исключения: System.ArgumentException

Сообщение об исключении: словарь параметров содержит пустую запись для параметра 'enumVar' с ненулевым типом 'NameSpace.Enums.MyEnum' для метода 'System.Web.Mvc.ActionResult GetContent (Int64, NameSpace.Enums.MyEnum, System.String, Int32, Int32, Int32, Int32, Int64) »в« NameSpace.Controllers.MyController ». Необязательный параметр должен иметь тип ссылки, обнуляемый тип или быть объявлен как необязательный параметр.

Имя параметра: параметры

URL запроса: 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
}

Также я должен упомянуть, что запрос завершается неудачей только иногда и не всегда, и это не согласовано. Это ошибка, которая была зарегистрирована в нашей исключительной базе данных.

Ответы [ 2 ]

4 голосов
/ 18 марта 2016

Pro Совет: не называйте параметры метода действия action.

MVC помещает туда фактическое имя метода действия контроллера, независимо от того, что у вас есть в строке запроса или в вашей форме (при условииИспользует сегмент {action} в вашем маршруте).Переменные маршрута имеют приоритет над всем, поэтому, если вы пытаетесь связать Enum с зарезервированным именем параметра, он просто не собирается работать .

1 голос
/ 27 декабря 2011

Похоже, что подшивка модели по умолчанию не включена в перечисления.Лучше всего было бы создать подкласс класса 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); 
    } 
} 

Код и логика: этот вопрос .

...