2011-04-03 9 views
7

tengo una estructura personalizada llamada TimeOfDay que se utiliza en un modelo vista como esta:modelo personalizado ligante no se llama cuando el tipo es anulable

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

He creado una carpeta de modelo personalizado llamado TimeOfDayModelBinder y registrada en Global .asax.cs como este:

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

Y todo funciona genial. Sin embargo, si cambio mi modelo de vista a este:

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

Mi carpeta de modelo personalizado ya no se llama. Sé que la propiedad ya no es un tipo de TimeOfDay, sino un Nullable que es diferente. Entonces esto significa que debo añadir mi carpeta modelo personalizado en dos ocasiones en Global.asax.cs así:

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

Funciona, pero no es sólo algo que no me gusta de ella. ¿Es esto realmente necesario para manejar mi tipo como nullable, o hay algo que me falta?

+0

No creo que te falte nada. Por lo que sé, esa es la forma estándar de hacerlo. – LukeH

+0

¿Alguna vez resolvió esto? Tengo un problema similar (pero no del todo). Ver [mi pregunta] (http://stackoverflow.com/questions/5519548/). – notJim

+0

@notJim No profundicé mucho más, pero la conclusión fue que necesitaba agregar el encuadernador dos veces. Una vez para las que no admiten nulos y una para las que aceptan nulos, ya que en realidad son dos tipos diferentes de la CLR. –

Respuesta

1

Por el comentario de @ LukeH, parece que es necesario. Supongo que eso también tiene sentido, ya que TimeOfDay y Nullable<TimeOfDay> realmente son dos tipos diferentes en el CLR. Así que supongo que tengo que vivir con eso. :-)

7

Esto no es realmente una respuesta a su pregunta, sino una solución alternativa. Puede haber uno mejor ...

En MVC3 puede crear un IModelBinderProvider. Una implementación sería algo como esto:

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

Se necesitaría para registrarlo en su contenedor DependencyResolver/COI o hacer esto (en el Global.asax - inicio de aplicaciones):

ModelBinderProviders.BinderProviders.Add(new TimeOfDayModelBinderProvider()); 
+0

+1 Interesante y agradable de saber. Pero en mi caso, creo que complicaría más las cosas de lo que lo simplificaría. Pero gracias de todas maneras. :-) –

Cuestiones relacionadas