FlagsEnum(列挙型:バイト)で動作するようにModelBinderを変更するにはどうすればよいですか?コードを表示します:
コード
列挙型
[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":[]}
モデルバインダー
JSONを使用しない場合に機能し、両方のEnunをFlagsEnunとして使用します。
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
??
モデルバインダー
GetValue<T>
クラスのメソッドでは、CreditoImobiliarioModelBinder
これbindingContext.ValueProvider.GetValue("Tipo");
はnullを返します??