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?
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());
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. :-)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With