ASP.Net MVC 2 Model Validation Regex Validator non riesce
-
02-10-2019 - |
Domanda
Ho seguente nella mia classe modello di metadati:
[Required(ErrorMessage = "Spent On is required")]
[RegularExpression(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]",
ErrorMessage = "Please enter date in mm/dd/yyyy format")]
[DataType(DataType.Date)]
[DisplayName("Spent On")]
public DateTime SpentOn { get; set; }
Ma ogni volta che lo chiamo ModelState.IsValid
restituisce sempre falso perché espressione regolare non sta convalidando. Ho abbinato la data inserita (08/29/2010) contro la nuova espressione regolare utilizzando lo stesso modello e si abbina perfettamente.
Che cosa sto facendo di sbagliato?
Soluzione
Questo perché regex vale per le stringhe e non proprietà DateTime
. Se l'utente immette una stringa non valida che non può essere analizzato a un'istanza DateTime
dal modello legante si aggiungerà un messaggio di errore generico davanti ai vostri esegue espressione regolare.
Hai un paio di possibilità:
- Personalizza il messaggio di errore in un file di risorse
- Scrivi un modello personalizzato legante
- utilizzare una proprietà stringa (mi sento in colpa per aver proposto questo: -))
Altri suggerimenti
actualy c'è un'altra soluzione per questo. Si può semplicemente creare una sottoclasse del RegularExpressionAttribute
public class DateFormatValidatorAttribute : RegularExpressionAttribute {
public DateFormatValidatorAttribute()
: base(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]")
{
ErrorMessage = "Please enter date in mm/dd/yyyy format";
}
public override bool IsValid(object value) {
return true;
}
}
nei tuoi Global.asax.cs sull'inizio dell'applicazione registrare l'addapter espressione regolare per la validazione lato client in questo modo:
DataAnnotationsModelValidatorProvider.RegisterAdapter(
typeof(DateFormatValidatorAttribute),
typeof(RegularExpressionAttributeAdapter));
Ora si arriva ad avere il build-in MVC regolare Exression lato client validatore e mantenere il DateTime come tipo di proprietà