DisplayFormat ApplyFormatInEditMode

Io uso MVC 3 in C #, ho una class con questo Attributo

[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}", ApplyFormatInEditMode = true)] 

Vorrei applicare la convalida quando un utente è in EDIT MODE

I dati nel database sono memorizzati con tipo datetime formattato come questo

  6/15/2009 1:45:30 PM 

Ricevo questo errore Error String non è nel formato corretto

Credo che il problema sia in

DataFormatString = “{0: dd MMM yyyy}”

hai qualche idea su come aggiustarlo?

L’attributo DisplayFormat è letteralmente solo per la visualizzazione del valore. Se imposti ApplyFormatInEditMode tutto ciò che farà sarà anche applicare il formato al contenuto dei tuoi dati quando visualizzati in una casella di testo (destinata all’Editing). Non ha niente a che fare con la convalida.

Se si desidera convalidare l’input utilizzando il formato specificato, è probabile che sia necessario creare il proprio ValidationAttribute e utilizzare DateTime.ParseExact() per verificare che soddisfi il formato che si prevede. L’unico inconveniente è che non avrà una logica di convalida del lato client che la accompagna, a meno che non la scriva.

Non l’ho testato molto bene, ma dovrebbe darti un inizio.

 public class DateTimeFormatAttribute : ValidationAttribute { public int Format { get; set; } public override bool IsValid(object value) { if (value == null) return true; DateTime val; try { val = DateTime.ParseExact(value.ToString(), Format, null); } catch(FormatException) { return false; } //Not entirely sure it'd ever reach this, but I need a return statement in all codepaths return val != DateTime.MinValue; } } 

Quindi è solo questione di usarlo. [DateTimeFormat(Format = "dd MMM yyyy")]

AGGIORNAMENTO: Mi dispiace, non penso di aver letto chiaramente la tua domanda. Il motivo per cui si lamenta dei dati sul postback è perché il formato che stai tentando di utilizzare non è standard. Potrebbe essere meglio implementare uno dei comuni raccoglitori di date online da utilizzare quando si compila il campo piuttosto che lasciare che sia modificato a mano o in attesa di un formato non standard come questo. I formati di visualizzazione personalizzati sono ottimi per la visualizzazione, ma se si desidera utilizzare un formato personalizzato per la modalità di modifica che il DateTime.Parse predefinito non comprende, è necessario scrivere il proprio ModelBinder, e questo è qualcosa che non avrei fatto in alternativa è ansible modificare il tipo di dati sul tuo viewmodel in stringa e analizzarlo autonomamente nel metodo action (puoi comunque utilizzare il validatore che ho fornito in questo caso). Per eliminare il tuo errore (ma rimuoverai anche il tuo formato personalizzato quando sei in modalità di modifica) dovresti rimuovere la proprietà ApplyFormatInEditMode .

0:dd MMM yyyy si aspetta una stringa come 06 JUN 2009 anziché il 6/15/2009 .

Come stai inserendo la stringa quando ottieni l’errore String Not in Correct Format ?