0

私は列挙型バインダーを正常に作成し、ivがテストしたものから、すべてが機能します。しかし、コントローラーにnull許容の列挙型パラメーターを設定したいのですが、null許容に変更すると、バインダーが機能しません。

 public class EnumBinder<T> : IModelBinder
    {
        private object DefaultValue { get; set; }
        public EnumBinder(object defaultValue)
        {
            DefaultValue = defaultValue;
        }


        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            if(result == null || string.IsNullOrEmpty(result.AttemptedValue))
            {
                return DefaultValue;
            }

            return GetEnumValue<T>(result.AttemptedValue);
        }



        public static object GetEnumValue<T>(string value)
        {
            var enums = Enum.GetValues(typeof (T)).Cast<T>().ToList();

            foreach (var e in enums)
            {
                var _enum = Enum.Parse(typeof (T), e.ToString());
                if (string.Equals(value, _enum.ToString(), StringComparison.InvariantCultureIgnoreCase))
                {
                    return _enum;
                }
            }

            return null;
        }

    }

で動作します

 public virtual ActionResult ControllerName(Status status)
    {
       return View();
    }

しかし、作業しないでください

 public virtual ActionResult ControllerName(Status? status)
    {
       return View();
    }

もちろん、アプリケーションの開始時にバインダーを登録しました

ModelBinders.Binders.Add(typeof(CallStatus), new EnumBinder<CallStatus>(null));

何が間違っているのですか、なぜコントローラーでnull許容列挙型を返すことができないのですか?

4

3 に答える 3

2

CallStatusCallStatus?、異なるタイプです。? シンタックスシュガーです。CallStatus?は実際にタイプSystem.Nullable<CallStatus>

こちら で説明されているように、用に別のバインダーを追加するかtypeof(Nullable<CallStatus>)、プロバイダーを使用する必要があります。

于 2013-01-29T01:03:35.743 に答える
1

Enum へのモデル バインディングは、MVC 3 または 4 のデフォルトの Model Binders で動作するはずです。

デフォルトのモデル バインダーを試してみましたが、機能していませんでしたか?

IIRC、デフォルトのバインディング動作は、列挙値の文字列表現である値に依存します。htmlビューを使用している場合(そうであるように)、これで問題ありません。JSON またはモデルの他の表現を使用している場合、途中で列挙型が整数表現に変換されて問題が発生する可能性があります。また、戻る途中で整数値を処理できるようにする必要がある場合カスタム バインダーが必要な場合があります。

于 2013-01-29T01:14:46.900 に答える
0

Nullable列挙型は値型であるため、列挙型を設定できます。で、オプションのパラメーターとして使用する場合は、サンプルのアクションのデフォルト値を設定する必要があります。

public virtual ActionResult ControllerName(Status? status = null)
{
   if (status.HasValue) { /* some logic */ }
   return View();
}

または、列挙型パラメーター タイプのデフォルト値を使用する

public virtual ActionResult ControllerName(Status status = Status.OK)
{
   /* some logic */
   return View();
}
于 2013-01-29T01:15:33.340 に答える