2013-10-09 21 views
5

Ho un modulo con due campi data, data inizio e data fine. Voglio convalidare i due campi per garantire che la data di inizio sia attiva o precedente alla data di fine. Ho scritto un validatore remoto e l'ho assegnato a entrambi i campi, ma questo può portare a più messaggi per lo stesso errore. Inoltre, se correggo una data la convalida non viene attivata nel campo non modificato lasciando il vecchio messaggio di erroreASP.Net MVC Convalida intervallo di date discreto

Come posso verificare due campi data l'uno contro l'altro per verificare che la data di inizio sia precedente o alla data di fine?

risposta

2

Ho avuto lo stesso problema alcune settimane fa. Credo che il modo migliore per risolvere il problema sia implementare un controllo lato client usando jquery. In questo modo è possibile chiamare la convalida ogni volta che si modifica il valore su StartDate o EndDate. In questo caso è meglio chiamare il server per convalidare i dati presenti sul client perché non si chiama il server.

Nel seguente collegamento esiste una procedura per implementare una convalida sul lato client. Link

Questa è la mia soluzione:

Passaggio 1: Creare la classe di attributi per convalidare le date consecutive

public class ConsecutiveDateAttribute : ValidationAttribute, IClientValidatable 
{ 
    public ConsecutiveDateAttribute() 
    { 
     ErrorMessage = "The date must be consecutive"; 
    } 

    public override bool IsValid(object value) 
    { 
     return true; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule(); 
     rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); 
     rule.ValidationParameters.Add("datefield", metadata.PropertyName); 
     rule.ValidationType = "consecutivedate"; 
     yield return rule; 
    } 
} 

IsValid metodo di ritorno sempre vero perché voglio convalidare i valori sul client- lato. La funzione GetClientValidationRules viene utilizzata per passare alla pagina cshtml il nome del campo coppia e il nome di convalida dell'evento per chiamare la convalida per ciascun campo.

Fase 2: Decorare con l'attributo ConsecutiveDate i campi che voglio per convalidare

[Required(), DataType(DataType.Date), ConsecutiveDate()] 
    public DateTime StartDate { get; set; } 

    [Required(), DataType(DataType.Date), ConsecutiveDate()] 
    public DateTime EndDate { get; set; } 

Fase 3: Implementare nella pagina del javascript per convalidare la data

<script src="@Url.Content("~/Scripts/jquery-1.10.2.js")" type="text/javascript" /> 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript" /> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 

<script type="text/javascript"> 

    if ($.validator && $.validator.unobtrusive) { 

     $.validator.unobtrusive.adapters.addSingleVal("consecutivedate", "datefield"); 

     $.validator.addMethod("consecutivedate", function(value, element) { 

      if ($("#StartDate").val() != "" && $("#EndDate").val() != "") 
       return $("#StartDate").val() <= $("#EndDate").val(); 

      // IF both values are not polupated I don't want to validate the field 
      return true; 
     }); 

    } 
</script> 

$ .validator. addMethod ("consecutivedate", function (value, element): questo registra la convalida per ogni campo che voglio validare

+0

Includi anche il contenuto del link qui per favore – deW1

+0

Mi dispiace è stata la mia prima risposta. Nextone sarà più completo. Grazie per il tuo feed-back. –

Problemi correlati