Работа с FlagsEnum, ModelBinders и JSON

Как изменить ModelBinder для работы с FlagsEnum (Enum: byte)? Я покажу код:

Код

Enum

[Flags]
public enum TipoPessoaEnum : byte
{
    Comprador = 1
    ,
    Proprietario = 2
    ,
    GerenteAgencia = 4
}

Учебный класс

public class PessoaViewModel
{
    public string Nome { get; set; }
    public DateTime? DataNascimento { get; set; }
    public TipoPessoaEnum? Tipo { get; set; }
    // Other fields have been omitted
}

Json

{"Id":0,"Nome":"Teste Flags 02","Tipo":["Comprador","Proprietario"],"Genero":"Masculino","Escolaridade":"","EstadoCivil":"","RegimeCasamento":"","Telefones":[],"Emails":[],"Enderecos":[]}

Модель Binder

Работает, когда не используется JSON, оба Enuns как FlagsEnuns.

public class CreditoImobiliarioModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext == null) throw new ArgumentNullException("bindingContext");

        if (bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName))
        {
            var values = GetValue<string[]>(bindingContext, bindingContext.ModelName);
            var modelType = bindingContext.ModelType.GetNonNullableModelType();

            if (values != null && values.Length > 1 && (modelType.IsEnum && modelType.IsDefined(typeof(FlagsAttribute), false)))
            {
                long byteValue = 0;
                foreach (var value in values.Where(v => Enum.IsDefined(modelType, v)))
                    byteValue |= (byte)Enum.Parse(modelType, value);

                return Enum.Parse(modelType, byteValue.ToString());
            }
        }

        return base.BindModel(controllerContext, bindingContext);
    }

    private static T GetValue<T>(ModelBindingContext bindingContext, string key)
    {
        if (bindingContext.ValueProvider.ContainsPrefix(key))
        {
            ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(key);
            if (valueResult != null)
            {
                bindingContext.ModelState.SetModelValue(key, valueResult);
                return (T)valueResult.ConvertTo(typeof(T));
            }
        }
        return default(T);
    }
}

Вопрос

Как видите, в классе PessoaViewModel, недвижимость Tipo может принимать несколько значений для TipoPessoaEnum,

Потому что собственность Tipo может принимать несколько значений, я посылаю (в формате JSON) массив Tipo"Tipo":["Comprador","Proprietario"], Каковы ценности enuns.

Как отобразить мой массив JSON "Tipo":["Comprador","Proprietario"] в мою собственность Tipo??

Модель Binder

В методе GetValue<T> класса CreditoImobiliarioModelBinder этот bindingContext.ValueProvider.GetValue("Tipo"); возвращает ноль??

0 ответов

Другие вопросы по тегам