7

TimeOfDay次のようなビューモデルで使用されるカスタム構造体があります。

public class MyViewModel
{
  public TimeOfDay TimeOfDay { get; set; }
}

と呼ばれるカスタムモデルバインダーを作成し、次のTimeOfDayModelBinderようにGlobal.asax.csに登録しました。

ModelBinders.Binders.Add(typeof(TimeOfDay), new TimeOfDayModelBinder());

そして、すべてがうまく機能します。ただし、ビューモデルを次のように変更すると、次のようになります。

public class MyViewModel
{
  public TimeOfDay? TimeOfDay { get; set; } // Now nullable!
}

私のカスタムモデルバインダーはもう呼び出されません。プロパティがTimeOfDayのタイプではなく、異なるNullableであることを私は知っています。つまり、次のように、Global.asax.csにカスタムモデルバインダーを2回追加する必要があるということです。

ModelBinders.Binders.Add(typeof(TimeOfDay), new TimeOfDayModelBinder());
ModelBinders.Binders.Add(typeof(TimeOfDay?), new TimeOfDayModelBinder());

それは機能しますが、私が気に入らないことがあります。これは私の型をnull許容として処理するために本当に必要ですか、それとも私が欠けているものがありますか?

4

2 に答える 2

8

これは実際にはあなたの質問に対する答えではありませんが、代替の解決策です。もっと良いものがあるかもしれません...

MVC3では、IModelBinderProviderを作成できます。実装は次のようになります。

public class TimeOfDayModelBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(Type modelType)
    {
          if(modelType == typeof(TimeOfDay) || modelType == typeof(TimeOfDay?))
            {
                 return  new TimeOfDayModelBinder();
            } 
           return null;
    }
}

DependencyResolver / IOCコンテナーに登録する、これを行う必要があります(Global.asax-アプリの起動で):

ModelBinderProviders.BinderProviders.Add(new TimeOfDayModelBinderProvider());
于 2011-04-03T23:31:56.643 に答える
1

@LukeHのコメントによると、それは必要なようです。これも理にかなっていると思いますTimeOfDay。CLRNullable<TimeOfDay>には2つの異なるタイプがあります。だから私はそれと一緒に暮らす必要があると思います。:-)

于 2011-04-19T22:57:16.357 に答える