Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881

    Customvalidator non valida

    Di solito la faccio solo clientside (lo so non si dovrebbe) ma in questo caso devo usare un customvalidator e faccio la validazione anche serverside... finora però con "poca soddisfazione".

    Ho due textbox per inserimento di PEC e codice univoco per fatt.elettronica.
    Ho aggiunto un customvalidator che fa in controllo serverside che almeno uno dei due campi contenga qualcosa BUT la funzione che fa il controllo non viene mai chiamata e non so pecchè....
    codice:
    <asp:FormView ID="FormView1" runat="server" DefaultMode="Insert" DataKeyNames="an_ID" DataSourceID="SqlNuoviCli" OnItemInserted="formview_Inserted" OnItemUpdated="formview_updated">
                <InsertItemTemplate>
    ...
      <asp:TextBox ID="tb_emailpec" runat="server" Text='<%# Bind("an_emailpec")  %>' ></asp:TextBox>
    <asp:TextBox ID="tb_coduffpa" runat="server" Text='<%# Bind("an_coduffpa")  %>' ></asp:TextBox>
    <asp:CustomValidator ID="FEvalidator" runat="server" ControlToValidate="tb_emailpec"  OnServerValidate="ValidaXFE" ErrorMessage="Email PEC o Codice Destinatario sono richiesti" ValidationGroup="newcli" Display="None"></asp:CustomValidator>
    
    
    codebehind
    Protected Sub ValidaXFE(sender As Object, e As ServerValidateEventArgs)
            Dim risultato As Boolean = True
            Try
                Dim tbpec As TextBox = DirectCast(FormView1.FindControl("tb_emailpec"), TextBox)
                Dim tbuni As TextBox = DirectCast(FormView1.FindControl("tb_coduffpa"), TextBox)
                If (tbpec.Text = "" And tbuni.Text = "") Then
                    risultato = False
                End If
            Catch ex As Exception
                risultato = False
            End Try
            e.IsValid = risultato
        End Sub
    La validazione lato server la lancio sull'evento inserting dell'sqldatasource agganciato al formview che contiene i controlli di cui sopra
    codice:
     Protected Sub SqlNuoviCli_Inserting(sender As Object, e As SqlDataSourceCommandEventArgs)
            Page.Validate("newcli")
            If Page.IsValid Then
                ....
            End If
        End Sub
    e page è sempre valid anche se lascio i due textbox vuoti perchè dal debugger vedo che non entra proprio nella funzione di controllo del contenuto dei campi ValidaXFE... WARUM?
    Ultima modifica di supermac; 21-06-2019 a 14:16
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  2. #2
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    Peraltro avrei già risolto: invece di usare un customvalidator richiamo la funzione ValidaXFE sull'evento inserting ed eventually interrompo l'insert con un messaggio di alert, però per cultura vorrei capire cosa non funzia con quel customvalidator
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Io ritengo i validatori asp.net abbastanza buoni e il CustomValidator, uno dei migliori (perchè ci posso fare tutto quello che voglio)

    Se sono dentro un FormView, nella parte EditItemTemplate e InsertItemTemplate, metto il CustomValidator.

    Per fare partire l'evento lato server, nell'evento FormView1.DataBound, associo l'evento con:

    AddHandler cv.ServerValidate, AddressOf CustomValidator1_ServerValidate

    e da lì proseguo

    Pietro

  4. #4
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    No compriendo: il validatore è già associato al controllo ed è anche già indicato su quale evento e quale funzione eseguire server side in quell'evento (ControlToValidate e OnServerValidate) perchè devo specificare un handler?
    codice:
    <asp:CustomValidator ID="FEvalidator" runat="server" ControlToValidate="tb_emailpec"  OnServerValidate="ValidaXFE" ErrorMessage="Email PEC o Codice Destinatario sono richiesti" ValidationGroup="newcli" Display="None"></asp:CustomValidator>
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ciao.
    Ero incuriosito dal tuo quesito. Pur non usando mai il controllo FormView, ho voluto provare.
    Nell'EditItemTemplate ho scelto il controllo che deve ricevere una data

    codice:
    <asp:TextBox runat="server" ID="data_ora" Text='<%#Eval("data_ora")%>'></asp:TextBox>
    e ho deciso di validarlo con un CustomValidator (per prova)

    codice:
    asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="Data non valida" ControlToValidate="data_ora" ClientValidationFunction="valida_data_ora" style="color:Red;"></asp:CustomValidator>
    Nota: ControlToValidate può essere valorizzato o no. Ho fatto prove con e senza

    ho disabilitato la validazione lato client perchè volevo concentrarmi sulla validazione lato server

    codice:
    function valida_data_ora(source, arguments)
    {
        alert(arguments.Value);
        arguments.IsValid = true;
    }

    Il controllo CustomValidator1 non lo vedo lato server, ossia, visual studio non lo vede e non può associare nessun evento. Perciò, nell'evento FormView1.DataBound metto (è un mio esempio):

    codice:
        Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.DataBound
            Dim lw As FormView = DirectCast(sender, FormView)
            If lw.CurrentMode = FormViewMode.Edit OrElse lw.CurrentMode = FormViewMode.Insert Then
                Dim dd As DropDownList = TryCast(lw.FindControl("comune"), DropDownList)
                If dd IsNot Nothing Then
                    msole.FillListControl(dd, gl.StringaConnessioneTest, "select id_comune, nome_comune from comuni where codice_istat_regione=""20"" order by nome_comune", "nome_comune", "id_comune", New ListItem(""))
                    If lw.CurrentMode = FormViewMode.Edit Then
                        Dim drv As DataRowView = TryCast(lw.DataItem, DataRowView)
                        Dim chiave As String = l.NullToString(drv("chiave_esterna_numero"))
                        dd.SelectedValue = chiave
                    End If
    
                End If
    
                Dim cv As CustomValidator = TryCast(lw.FindControl("CustomValidator1"), CustomValidator)
                AddHandler cv.ServerValidate, AddressOf CustomValidator1_ServerValidate
    
            End If
        End Sub
    e la funzione CustomValidator1_ServerValidate è:

    codice:
        Private Sub CustomValidator1_ServerValidate(sender As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs)
            Dim cv As CustomValidator = DirectCast(sender, CustomValidator)
            Dim s As String = ""
            Dim result As DateTime
    
            If String.IsNullOrWhiteSpace(cv.ControlToValidate) Then
                Dim lw As FormView = Me.FormView1
                If lw.CurrentMode = FormViewMode.Edit OrElse lw.CurrentMode = FormViewMode.Insert Then
                    Dim c As TextBox = TryCast(lw.FindControl("data_ora"), TextBox)
                    s = c.Text
                End If
            Else
                s = args.Value
            End If
    
            If Not String.IsNullOrWhiteSpace(s) Then
                args.IsValid = DateTime.TryParse(s, result)
            End If
    
        End Sub
    Pietro

  6. #6
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    Si ho capito tutti i passaggi ma continuo a non capire perchè devo creargli un handler per farlo funzionare.... boh, mi adeguo
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    ho trovato questo, e sembra funzionare

    https://stackoverflow.com/questions/...ks-in-formview

    ma adesso sono io che non capisco



    Pietro

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Ma che caspita di domande estive fai?

    Adesso mi funziona esattamente come hai fatto te


    Ho tolto ValidationGroup="V" , consiglio tratto dal link che ho messo prima


    Pietro

  9. #9
    Utente di HTML.it L'avatar di supermac
    Registrato dal
    Jun 2001
    Messaggi
    1,881
    ...tranne che a me non funzionava comunque:
    il page.validate esegue la validazione serverside, ne forza l'esecuzione, e quindi (avrebbedovuto)entra(re) nella funzione del customvalidator e fa tutto quello che deve fare senza bisogno di fargli un handler... io poi forzavo la validazione di quello specifico validationgroup...
    Ora che vedo non avevo indicato il validationgroup nei controlli textbox, vuoi mica che sia quello il motivo per cui non mi andava?

    Però, domanda, la validazione lato server avevo letto da qualche parte che viene sempre eseguita comunque dal framework, senza bisogno di essere invocata col page.validate... l'ho letto su Zagor forse...
    W la Ferari effetrenavenave!
    il computer è un somaro veloce! (neanche tanto ndr)

  10. #10
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Allora, dalla prima versione del framework (tanto tanto tmpo fa) avevo visto in un esempio di Francesco Balena, la forzatura della validazione, con Me.Validate()

    Tempo dopo, visto che i validatori andavano a leggere le informazioni su database, notai che la procedura di validazione veniva richiamata due volte. Perciò l'ho tolta e funziona bene.
    In un vecchio esercizio ho:
    codice:
        Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
            Try
                '----------------------------------------------------------------------
                'Me.Validate() è indispensabile se Button1 ha CausesValidation="False"
                '----------------------------------------------------------------------
                'Forza la validazione di tutti i controlli
                'Me.Validate()
                If Not Me.IsValid Then
                    Throw New Exception("La scheda non ha passato i controlli di validità.")
                End If
    
                Salvo()
    
    
    
            Catch ex As Exception
                l.MsgBox(Me, ex)
    
    
            End Try
    
        End Sub
    dove vedi che la forzatura della validazione è disabilitata, e funziona perfettamente.

    Di più non so, però l'uso di AddHandler per gli eventi mi piace

    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.