2

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を返します??

4

0 に答える 0