2011-03-13 10 views
6

que he intentado:¿Cómo se permite el valor nulo en el valor obligatorio de DateTime en formato .NET MVC3 HTML?

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}", ConvertEmptyStringToNull = true)] 
[Required(AllowEmptyStrings = true)] 
public DateTime? BirthDateFrom { get; set; } 

y

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")] 
[Required] 
public DateTime? BirthDateFrom { get; set; } 

y todas las combinaciones con y sin ConvertEmptyStringToNull y AllowEmptyStrings.

Teniendo en cuenta, que tienen:

@Html.EditorFor(m => m.BirthDateFrom) 

me puede enviar el formulario con fecha válida, pero con cadena vacía en ese campo, que sólo sirve rojo y el formulario no se pueden presentar. ¿Cómo se permite el envío de formularios HTML con un valor de cadena nulo o vacío en el valor obligatorio de DateTime?

+1

Parece una contradicción en terminis. Si el campo es obligatorio, ¿por qué es anulable? ¿Estás buscando una forma de expresar DateTime.Empty? El requisito es confuso. – rene

+0

@rene DateTime.Empty estaría bien. – Hogan

+0

Un campo de "obligatorio para nulos" no tiene sentido, que es probablemente la razón por la que no se puede adaptar al funcionamiento de MVC. Dicho eso, eliminar el atributo requerido debería ser el truco, ¿no? – kprobst

Respuesta

9

Me parece que simplemente eliminando la anotación [Required] cumplirá por completo su requisito.

5

El hecho de que el tipo sea nulo implica que el valor es no es necesario. No tiene sentido aplicar un valor nulo o a un valor nulo, ya que el valor nulo no proporciona ninguna información de todos modos.

Parece que el problema es que tiene significados de 'null', p. Ej. 'ninguno' contra 'cualquiera' contra 'desconocido'. Lamentablemente, el concepto .NET de null no incluye diferentes tipos de nulo. La única forma de comunicar esto sería usar: -

a) valores 'sentinales', p. DateTime.MinValue comunica algo especial, y está seguro de que DateTime.MinValue nunca será un valor válido en su modelo de dominio.

b) utilice indicadores externos para indicar el significado del valor DateTime faltante, p. bool isAny, bool isUnknown, etc. o quizás una enumeración apropiada

0

Si se trata de EF, podría hacerlo opcional de esta manera.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<SomeObject>().Property(m => m.somefield).IsOptional();    
    base.OnModelCreating(modelBuilder); 
} 
Cuestiones relacionadas