2015-09-16 11 views
12

Ho la sensazione che questo potrebbe essere un problema molto semplice, ma non è possibile per la vita di me capirlo.Il validatore personalizzato non si attiva se il controllo non è stato compilato in

Ho un asp: casella di testo. Ho un validatore personalizzato su cui ha convalida client e server side.

Ecco il codice:

<asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox> 

<asp:CustomValidator ID="vldFirstName" runat="server" ControlToValidate="txtFirstName" 
    ClientValidationFunction="ValidateName" OnServerValidate="vldFirstName_ServerValidate" 
    Text="Please put in your first name" ErrorMessage="First name missing" 
    ForeColor="Red" font-bold="true" Display="Dynamic" 
    ValidateEmptyText="true"> 
</asp:CustomValidator> 

Ciò convalida correttamente sul lato server, se mi basta andare dritto nella mia pagina e fare clic su Invia, lasciando vuota la casella di testo.

Tuttavia con convalida lato client. Se vado nella scatola e vi esco direttamente senza digitare nulla. La convalida javascript non viene attivata. Se poi scrivo qualcosa. Lascia la scatola. Torna indietro e quindi deseleziona la casella di lavoro. Ritorna dicendo che è vuoto.

Tuttavia, lo voglio appena entrano nella scatola e lasciano fare la convalida. Non sono sicuro del motivo per cui il validatore non viene attivato se la casella di testo non è stata modificata.

+2

Potrebbe essere utile vedere il codice 'ValidateName'. – stuartd

+0

@stuartd, il codice di validazione è semplice al momento controllando la lunghezza se è maggiore di 3 e il valore non è nullo. Ho effettuato il debug e ho inserito un punto di interruzione ogni volta che il codice viene chiamato lato client. Funziona bene quando ho messo qualcosa in e poi cancellato. Ma si attiva se è appena stato saltato attraverso – Sam

+0

Cosa dice 'ValidateName' dice che il valore di input è quando viene saltato e quando viene inserito/eliminato? – LGSon

risposta

4

inserire lo script di seguito in qualsiasi punto della webform, e funzionerà nel modo desiderato:

document.addEventListener('DOMContentLoaded', function() { 
    [].forEach.call(document.querySelectorAll('input'), function(el, i) { 
    el.addEventListener('blur', ValidatorOnChange); 
    }); 
}); 

Il validatore non funziona in modo nativo nel modo desiderato, perché attachs un gestore onchange evento al Caselle di testo, quindi, se non si modifica affatto il testo, non si ottiene la convalida.

Ma se imponi a tutti i TextBox di attivare lo stesso evento onblur, allora, se hai cambiato il testo o meno, attiverà la convalida, ed è quello che sta facendo lo script sopra: aggiungendo quel gestore di eventi a tutti i TextBox nella pagina e chiamando la funzione ValidatorOnChange quando si verifica.

Nota: se si dispone già di uno script richiamato in ogni modulo Web presente nell'applicazione e si desidera che questo comportamento funzioni ovunque, è possibile aggiungere il codice in tale script (ovunque all'interno) e la soluzione si propagherà a tutti i tuoi webforms.

+1

Ciò ha funzionato perfettamente. Grazie – Sam

2

Ho testato quel codice, con la convalida del client casuale e la convalida non è stata attivata correttamente.

ho aggiunto gli elementi senza ostacoli:

  1. al caricamento della pagina: (o comunque lo si voglia attivarlo)

    protected void Page_Load(object sender, EventArgs e) 
    { 
        Page.UnobtrusiveValidationMode = UnobtrusiveValidationMode.WebForms; 
    } 
    
  2. Assicurarsi che jQuery è caricato:

su global.asax:

protected void Application_Start(object sender, EventArgs e) 
     { 
      ScriptManager.ScriptResourceMapping.AddDefinition("jquery", 
      new ScriptResourceDefinition 
     { 
      Path = "~/scripts/jquery-2.1.4.min.js", 
      DebugPath = "~/scripts/jquery-2.1.4.js", 
      CdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.0.min.js", 
      CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.0.js" 
     }); 
     } 

Dopo che questi due sono stati aggiornati (e ho un submit btn) ha funzionato bene.

SO, controllare se si carica la convalida non ostruita e che jQuery è caricato.

2

devi chiamare

se (Page.IsValid)

il postback nel server, altrimenti il ​​vostro convalida del server non verrà chiamato. Il RequiredFieldValidator si convalida sul client, ecco perché questo funziona. Tuttavia, dovresti sempre convalidare anche sul server.

Per la convalida lato client è necessario scrivere un metodo JavaScript che faccia lo stesso. È possibile impostare l'attributo nel CustomValidator:

ClientValidationFunction = "YourValidationMethod"

e il metodo fa qualcosa del genere

function YourValidationMethod(source, args) 
{ 

    if (valid) // do check here 
    args.IsValid = true; 
    else 
    args.IsValid = false; 
} 
+0

Il lato server uno funziona bene se registro. È il lato client che non si attiva se la casella di testo non ha mai avuto nulla in esso – Sam

2

Credo che CustomValidators sono in base alla progettazione destinati ad agire separatamente dal RequiredFieldValidators, e è normale per loro non sparare su campi vuoti.

+1

Sì, non si attiva sui campi vuoti per impostazione predefinita, ma se si specifica ValidateEmptyText su true, dovrebbe attivarsi ogni volta – Viru

2

Ahh, le gioie di asp.webforms netti :)

Se si utilizzano altri controlli, come radControls forniti con la propria versione di jQuery, che potrebbe essere un problema, assicurarsi di utilizzare quello fornito con il framework disabilitando il loro.

In alternativa è possibile disattivare la convalida discreta nel web.config e vedere se questo lo fa attivare quando è vuoto.

<appSettings> 
    <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" /> 
</appSettings> 
+0

Utilizzo della versione di framework. Ho provato questo e non è diverso. Creato un nuovo progetto. Aggiunta una casella di testo con validatore personalizzato ma non si attiva a meno che qualcosa non sia stato digitato, quindi ho perso il focus, quindi posso cancellare il testo e verrà attivato correttamente – Sam

2

Come per la documentazione MSDN ... quello che ho uderstand sulla validateEmptyText = true si innescherà la (funzione Javascipt validateName) convalida personalizzata, anche se casella di testo è vuota.

Potrebbe essere sul primo valore di caricamento non definito per quella casella di testo ma quando si modifica e annulla il valore della casella di testo sarà ora vuoto. .

un modo è quello di inizializzare il valore casella di testo con una stringa vuota in caso di carico di forma

ma penso che è possibile risolvere il problema utilizzando validatore campo obbligatorio con validatore personalizzato, che è l'approccio migliore.

+0

Nope still same. Ho provato ad aggiungere un validatore di campi obbligatorio e ho provato a impostare il valore come 'String.Empty;' nel Page_Load fa ancora lo stesso. Non verrà convalidato a meno che qualcosa non sia stato digitato per primo – Sam

Problemi correlati