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
Includi anche il contenuto del link qui per favore – deW1
Mi dispiace è stata la mia prima risposta. Nextone sarà più completo. Grazie per il tuo feed-back. –