问题
I have a custom struct called TimeOfDay
which is used in a view model like this:
public class MyViewModel
{
public TimeOfDay TimeOfDay { get; set; }
}
I have created a custom model binder called TimeOfDayModelBinder
and registered it in Global.asax.cs like this:
ModelBinders.Binders.Add(typeof(TimeOfDay), new TimeOfDayModelBinder());
And everything works great. However, if I change my view model to this:
public class MyViewModel
{
public TimeOfDay? TimeOfDay { get; set; } // Now nullable!
}
My custom model binder is no longer called. I know that the property is no longer a type of TimeOfDay, but a Nullable which is different. So does this mean I should add my custom model binder twice in Global.asax.cs like this:
ModelBinders.Binders.Add(typeof(TimeOfDay), new TimeOfDayModelBinder());
ModelBinders.Binders.Add(typeof(TimeOfDay?), new TimeOfDayModelBinder());
It works, but there's just something I don't like about it. Is this really necessary to handle my type as nullable, or is there something I'm missing?
回答1:
This isn't really an answer to your question, but an alternative solution. There might be a better one...
In MVC3 you can create a IModelBinderProvider. An implementation would be something like this:
public class TimeOfDayModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(Type modelType)
{
if(modelType == typeof(TimeOfDay) || modelType == typeof(TimeOfDay?))
{
return new TimeOfDayModelBinder();
}
return null;
}
}
You'd need to register it in your DependencyResolver/IOC container or do this (in the Global.asax - app start):
ModelBinderProviders.BinderProviders.Add(new TimeOfDayModelBinderProvider());
回答2:
Per @LukeH's comment, it seems it is necessary. I guess that makes sense too, as TimeOfDay
and Nullable<TimeOfDay>
really is two different types in the CLR. So I guess I have to live with it. :-)
来源:https://stackoverflow.com/questions/5533198/custom-model-binder-not-called-when-type-is-nullable