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 中添加我的自定义模型绑定器两次,如下所示:

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

它有效,但我不喜欢它。这真的有必要将我的类型处理为可为空的,还是我缺少什么?

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 的评论,似乎有必要。我想这也是有道理的,因为TimeOfDayCLRNullable<TimeOfDay>中有两种不同的类型。所以我想我必须忍受它。:-)

于 2011-04-19T22:57:16.357 回答