2012-04-15 4 views
14

Ho il seguente modello:multipli di convalida campi utilizzando convalida remota

public class Customer 
{ 
    public string FirstName {get;set;} 

    public string LastName {get; set;} 

    [Remote("CardExisting", "Validation", AdditionalFields="FirstName,LastName") 
    public string CardNumber {get; set;} 
} 

azione CardExisting controllerà che non ci sia un record esistente per la combinazione di cardNumber per il nome e cognome.

E se l'utente prima immette il numero della carta e poi il suo nome, non posso convalidarlo, quindi quando ritorna e inserisce il suo nome ho bisogno di riconfigurare a distanza, come posso farlo quando il focus era già perso dal numero di carta proprietà?

risposta

3

Il modo in cui ho ottenuto questo funzionamento è aggiungendo JavaScript.

$("#FirstName").change(function() { 
     $('#CardNumber').removeData('previousValue'); 
     $('#CardNumber').valid(); 
    }); 

Così, quando il primo nome è cambiato di cancellare tutti i valori precedenti da numero della carta e ri-convalidare il numero della carta.

20

Espandendo la risposta di Jaluka, ho scritto questo metodo di supporto che trova ogni elemento di convalida remoto che ha "campi aggiuntivi" e quindi causa la convalida su detto elemento per sparare ogni volta che uno di questi campi cambia.

// I hate naming things 
function initializeRemotelyValidatingElementsWithAdditionalFields($form) { 
    var remotelyValidatingElements = $form.find("[data-val-remote]"); 

    $.each(remotelyValidatingElements, function (i, element) { 
     var $element = $(element); 

     var additionalFields = $element.attr("data-val-remote-additionalfields"); 

     if (additionalFields.length == 0) return; 

     var rawFieldNames = additionalFields.split(","); 

     var fieldNames = $.map(rawFieldNames, function (fieldName) { return fieldName.replace("*.", ""); }); 

     $.each(fieldNames, function (i, fieldName) { 
      $form.find("#" + fieldName).change(function() { 
       // force re-validation to occur 
       $element.removeData("previousValue"); 
       $element.valid(); 
      }); 
     }); 
    }); 
} 

Chiamare la funzione in questo modo:

$(document).ready(function() { 
    initializeRemotelyValidatingElementsWithAdditionalFields($("#myFormId")); 
}); 
+1

W00t !!! Due giorni fa hai risposto a questo e ne avevo bisogno proprio ora ... il tuo codice funziona GRANDE! :) Nel mio caso ho 2 elenchi a discesa che devono lavorare insieme, cioè uno è il campo aggiuntivo dell'altro. Bella soluzione per qualcosa che dovrebbe essere predefinito IMHO. :) –

+0

hehehe Inoltre non mi piace nominare le cose ... ma data la natura della nostra professione è intrinsecamente necessaria più volte al giorno! : D –

+0

Grazie, questa soluzione sta funzionando bene anche per MVC4. –

2

se non ti piace creare script client:

public class Customer 
    { 
     [Remote("CardExisting", "Validation", AdditionalFields = "CardNumber,LastName")] 
     public string FirstName { get; set; } 
     [Remote("CardExisting", "Validation", AdditionalFields = "FirstName,CardNumber")] 
     public string LastName { get; set; } 
     [Remote("CardExisting", "Validation", AdditionalFields = "FirstName,LastName")] 
     public string CardNumber { get; set; } 
    } 

e convalidare in CardExisting tutti i campi sono pieni o no