Работа с 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");
возвращает ноль??