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?

È stato utile?

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à:

  1. Personalizza il messaggio di errore in un file di risorse
  2. Scrivi un modello personalizzato legante
  3. 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à

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top