51 messaggi dal 15 maggio 2012
Sto lavorando ad un applicazione web scritta in asp.net e web form.
Ho creato una formview bindata ad un sqldatasource dalla quale inserisco senza problemi i dati nel mio database.

Il problema giunge nel momento in cui vengono sollevati degli errori durante l'esecuzione della query,o piu in generale durante il submit della form.

Questa situazione di errore reindirizza l'utente alla pagina generica di errore di asp.net.

Quello che vorrei capire è se sia possibile evitare il redirect della pagina effettuando una specie di "return false" nel metodo "Page_Error", in modo da mostrare l'errore sollevato in un alert o in un contenitore sempre sulla stessa pagina,mantenendo i dati che l'utente ha inserito.

Un'esempio di cosa sto cercando di ottenere è questo:

Protected Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
        Dim ex As Exception = Server.GetLastError()

        'Effettuare delle operazioni per mostrare l'eccezione
        ...

        'Evitare il redirect in qualche modo,con qualcosa simile a
        preventDefault() 
        'oppure
        Return false    
    End Sub
103 messaggi dal 04 ottobre 2010
Ti basta utilizzare la direttiva
try
{
<codice che può generare l'errore>
}
catch(Exception ex){
<codice che dice cosa fare se avviene un errore>
}
In visual basic a dire il vero non mi ricordo com'è la sintassi della direttiva try catch, comunque, nel catch l'errore è salvato nella variabile di tipo Exception di nome ex (il nome della variabile è arbitrario, lo decidi tu), ed il messaggio di errore è contenuto nell'attributo ex.Message . A volte, nei controlli personalizzati (per esempio nell'inserimento dati di un form), è possibile lanciare delle eccezioni personalizzate, esempio:
if(eta<18)
throw new Exception("Non puoi richiedere questo tipo di assicurazione se non sei maggiorenne");
end if
Se questo if fosse all'interno di un try...catch e l'età avesse valore 15 per esempio, nel catch verrebbe catturata l'eccezione personalizzata che lanci ed il suo message sarebbe il messaggio che vedi all'interno delle parentesi
Modificato da Biohazard il 08 agosto 2013 09.06 -
103 messaggi dal 04 ottobre 2010
Per l'errore generato da una query proveniente da un SqlDataSource, è possibile invece, intervenire sull'evento selected, dove abbiamo l'eventargs SqlDataSourceStatusEventArgs alla sottoscrizione dell'evento, tra i parametri di ingresso. Questo oggetto, solitamente chiamato e, ha le proprietà che ti servono, ovvero e.Exception ed e.ExceptionHandled. Nel caso non si sia un'eccezione, e.Exception == null, altrimenti è valorizzata. Se gestisci l'eccezione, allora dovrai mettere e.ExceptionHandled=true, così che asp.net non prenderà l'iniziativa di gestirselo lui. Scusa se la risposta di prima è poco inerente ma avevo interpretato male il problema.
Modificato da Biohazard il 08 agosto 2013 09.26 -
51 messaggi dal 15 maggio 2012
Biohazard ha scritto:
Ti basta utilizzare la direttiva
try
{
<codice che può generare l'errore>
}
catch(Exception ex){
<codice che dice cosa fare se avviene un errore>
}

Ciao,
Grazie della risposta, in ogni caso ,conosco gia la possibilità di utilizzare il blocco try catch per catturare gli errori,ma in questo ambito sembra non essere utilizzabile, visto che le query vengono lanciate in automatico dai bottoni della form e non sono io a lanciare il codice direttamente. In altre parole quello che faccio io è impostare un update command nel sqldatasource e poi creare un bottone asp con comando "update":

 <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="Salva"/>


il codice poi viene lanciato in automatico,quindi non ho la possibilità di includerlo in un blocco try/catch, ecco perchè cercavo un modo per gestirlo nel page_error...
51 messaggi dal 15 maggio 2012
Biohazard ha scritto:
Per l'errore generato da una query proveniente da un SqlDataSource, è possibile invece, intervenire sull'evento selected, dove abbiamo l'eventargs SqlDataSourceStatusEventArgs alla sottoscrizione dell'evento, tra i parametri di ingresso. Questo oggetto, solitamente chiamato e, ha le proprietà che ti servono, ovvero e.Exception ed e.ExceptionHandled. Nel caso non si sia un'eccezione, e.Exception == null, altrimenti è valorizzata. Se gestisci l'eccezione, allora dovrai mettere e.ExceptionHandled=true, così che asp.net non prenderà l'iniziativa di gestirselo lui. Scusa se la risposta di prima è poco inerente ma avevo interpretato male il problema.
Modificato da Biohazard il 08 agosto 2013 09.26 -


No problem per la risposta,in ogni caso anche questo metodo l'ho gia testato,anzi a dire la verità è proprio il metodo che ho preso in considerazione come uno dei migliori per risolvere il problema.

Questo metodo tuttavia, impedisce il redirect alla pagina di errore ma non impedisce il refresh della form,che quindi rifacendo la query per selezionare i dati(parlo nel caso della form di modifica) non mantiene le modifiche apportate dall'utente perchè va a ripopolare i campi.

Attualmente il mio codice si presenta cosi:

Protected Sub SqlDataSource1_Inserted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs) Handles  SqlDataSource1.Inserted
 sql_exception_handler(e)
End Sub

Protected Sub sql_exception_handler(ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs)
        If Not e.Exception Is Nothing Then
            Dim s() As String = {}
            Dim msg As String = "Si sono verificati degli errori durante l'esecuzione della query SQL:\n\n---------------------------------------------\n\n" & _
                                e.Exception.Message & "\n\n---------------------------------------------\n\n"

            field_backup(DettaglioMateriali, s)
            e.ExceptionHandled = True

            Session("exception") = msg
        End If
    End Sub

 Protected Sub field_backup(ByVal form As FormView, ByVal except() As String)
        Dim txt As TextBox
        For Each oControl In form.Controls(0).Controls(1).Controls(0).Controls
            Try
                txt = DirectCast(oControl, TextBox)
                If Not except.Contains(txt.ID) Then
                    Session(txt.ID) = txt.Text
                End If
            Catch ex As Exception
            End Try
        Next
    End Sub



Con l'ultima funzione "field_backup" faccio un copia dei valori dei campi della form che poi ripristino dopo il refresh ma resta il fatto che tutto questo "workaround" me lo potrei risparmiare se trovassi una maniera per fermare direttamente il flusso del programma quando viene generato l'errore e rimanere sulla form attuale senza nessun refresh.
115 messaggi dal 01 novembre 2012
Pienamente d'accordo su quanto detto, anche se su una query io mi preoccuperei di passare i dati congrui così come se li aspetta la query in modo da evitare che possa generare l'errore.
Pertanto imposterei una mini procedura per le variabili in input.
In quanto a velocità di esecuzione sicuramente tutto ció che puoi scriverete in modo dichiarativo nel codice origine ha sicuramente una performance senza paragoni.

Ciao

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.