E' corretto o comunque è un errore grave usare l'istruzione MsgBox ?

venerdì 03 ottobre 2008 - 15.37

ravalon Profilo | Expert

Quello che mi chiedo è se l'uso dell'istruzione MSGBOX sia corretto nelle pagine ASPX....

Sul mio pc funziona alla grande...e come non potrebbe funzionare dato che la funzione è resa disponibile ci sarà un motivo....
So che qualcuno dirà di usare response.write al suo posto ma non è la stessa cosa....

La domanda più nel dettaglio è questa....è un errore che pago poi con problemi di funzionamento una volta che non sono più nell'IDE di Visual Web Developer oppure ,anche se non bellissimo, la posso usare lo stesso senza intercorrere in problemi ?

rossimarko Profilo | Guru

Ciao,

la message box si usa nei progetti windows forms non nei siti web. La messagebox che tu visualizzi il client che accede al sito remoto non la vedrà mai.
Se vuoi ottenere la stessa funzionalità in un sito web puoi generare un javascript che attraverso l'istruzione alert visualizza una finestrella in stile msgbox sul browser
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

memmo77 Profilo | Expert

Io utilizzando nelle mie pagine lo ScriptManager, per scrivere i mie messaggi uso la seguente sintassi:

ScriptManager.RegisterStartupScript(Me, Me.GetType, "key", "alert('" TUO MESSAGGIO"')", True)

Funziona alla grande per le applicazioni web. Ciao

ravalon Profilo | Expert

Allora come mai su VWD è disponibile ? solo per consentire un debug migliore magari ?

ravalon Profilo | Expert

e un metodo che sia valido senza lo scriptmanager potete passarmelo ? Cosi sostituisco ogni chiamata alla msgbox alla nuova sub dove metto dentro il codice che mi passate...

memmo77 Profilo | Expert

Non so, dovrebbe essere lato server, infatti se provi ad utilizzarlo con pagine che contengono ajax non funziona e va in errore. Parlo sempre di applicazioni web.
E quella che ti ho messo sopra a me funziona correttamente.
Ciao

memmo77 Profilo | Expert

Response.Write("<script>alert('tuo messaggio');parent.location.href = 'index.aspx';</script>")

parent.location.href ti serve se dopo il messaggio devi mandare l'utente da un altra parte. Altrimenti toglilo
Ciao

rossimarko Profilo | Guru

Per visualizzare il javascript non serve inserire lo scriptmanager, basta utilizzare il metodo della pagina Page.ClientScript.RegisterStartupScript (http://msdn.microsoft.com/en-us/library/system.web.ui.clientscriptmanager.registerstartupscript.aspx)

Ti posto un piccolo esempio
Dim strMessaggio As String = "alert('messaggio da visualizzare');" Page.ClientScript.RegisterStartupScript(Me.GetType(), "alertpagina", strMessaggio, True)

Vi consiglio di non usare response.write perchè soprattutto con ajax potrebbe dare dei problemi in quanto non rispetta il ciclo di vita della pagina

>Allora come mai su VWD è disponibile ? solo per consentire un debug migliore magari ?

La funzione è disponibile perchè era una funzione di vb6 e per compatibilità è stata mantenuta (solo per VB.net ovviamente, non per c#). Nelle windows forms comunque è più corretto usare MessageBox.Show (http://msdn.microsoft.com/it-it/library/system.windows.forms.messagebox.show.aspx)
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

memmo77 Profilo | Expert

Si si il response.write non funziona con pagine ajax.

ravalon Profilo | Expert

E' vero, per quello prima dicevo che non volevo usarlo...

ho provato il codice di memmo ma mi da errore....

Io avrei bisogno di un codice da inserire in una sub....che poi richiamerò la dove avevo erroneamente richiamato MsgBox....

sto provando con ClientScriptManager.RegisterStartupScript ma non è che mi risulta molto facile....a quanto ho capito in questo modo viene registrato il codice al Load della pagina...e non si confà moltissimo con quanto necessito...

memmo77 Profilo | Expert

Che errore ti da?

ravalon Profilo | Expert

e' lunghissimo....

dice alla fine HTTPModules or server trace is enabled....

Details: error parsing near '<script> ecc.ecc.


Non sarà per caso perchè uso AJAX nella pagina ?

memmo77 Profilo | Expert

E' si, se usi ajax, nella pagina vb devi usare:

ScriptManager.RegisterStartupScript(Me, Me.GetType, "key", "alert('" TUO MESSAGGIO"')", True)

Per inserire nel tuo codice aspx lo ScriptManager , puoi trascinarlo nella pagina in modo visuale o inserire nel codice:

<asp:ScriptManager ID="ScriptManager1" runat="server" AsyncPostBackTimeout="600">
</asp:ScriptManager>

AsyncPostBackTimeout serve per stabilire il timeout della pagina per l'ajax, nel mio caso lo utilizzo su una funzione che serve a visualizzare una barra di progresso.
Ti ricordo che in ordine, l'oggetto ScriptManager deve essere al di sopra di tutto quello che inerente ad esso.

Ciao

ravalon Profilo | Expert

A me servirebbe qualcosa di utilizzabile sempre...comunque usare due procedure non sarebbe poi un problema....

ma questo codice lo devo mettere per forza nella LOAD ? perchè io lo stavo mettendo nell'evento dove voglio che sia visualizzato il messaggio...

martinez Profilo | Senior Member

Ciao letto dei tuoi problemi con la MsgBox ... io a volte in asp.net solo esclusivamente per quelle decisioni si/no ... uso il metodo OnClientClick ....

ad esempio in un button che si occupa di cancellare che ne sooooo un record dal DB uso il seguente:

<asp:Button ID="btnDelete" OnClientClick="return confirm('Sei sicuro di cancellare?')" runat="server" Text="Elimina" CommandName="Delete" />

spero possa esserti utile e rientrare nel tuo caso specifico ...

Saluti

ravalon Profilo | Expert

Il problema è che sono messaggi generati per altri motivi a seconda del procedere del codice...grazie comunque della dritta

Ho provato costruendo un metodo in una mia classe generica e richiamandolo passandogli i vari valori necessari

******************************************************
Dim gen As New ClassGenerali
gen.MostraMessaggio(Me, "KEY!", "CIAO")
******************************************************

La sub è questa
******************************************************
Public Sub MostraMessaggio(ByVal P As Page, ByVal strKey As String, ByVal strMsg As String)
ScriptManager.RegisterStartupScript(P, P.GetType, strKey, "alert('" + strMsg + "')", True)
End Sub
******************************************************

E funziona alla grande... anche essendo richiamata da dentro ad un evento diverso dal LOAD...

Però se ho capito bene, lo posso usare solo nelle pagine che usano AJAX ???? Eppure ho usato un codice che sfrutta uno SCRIPTMANAGER generico...infatti usando quello che ho inserito per AJAX non funziona....

rossimarko Profilo | Guru

>sto provando con ClientScriptManager.RegisterStartupScript ma
>non è che mi risulta molto facile....a quanto ho capito in questo
>modo viene registrato il codice al Load della pagina...e non
>si confà moltissimo con quanto necessito...

Il codice viene eseguito al load della pagina, ma si riferisce al browser non all'esecuzione lato server.
In pratica viene eseguito appena la pagina viene ricaricata all'interno del browser. Lo puoi inserire ad esempio all'interno dell'evento click di un bottone o nell'item command di una griglia.

Comunque di solito si utilizzano due modi per visualizzare dei messaggi all'interno di una pagina:
- il primo è con degli alert
- il secondo è con un controllino fatto apposta che visualizza il messaggio in formato html

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

rossimarko Profilo | Guru

>La sub è questa
>******************************************************
>Public Sub MostraMessaggio(ByVal P As Page, ByVal strKey As String,
>ByVal strMsg As String)
>ScriptManager.RegisterStartupScript(P, P.GetType, strKey, "alert('"
>+ strMsg + "')", True)
>End Sub
>******************************************************
>
>E funziona alla grande... anche essendo richiamata da dentro
>ad un evento diverso dal LOAD...
>
>Però se ho capito bene, lo posso usare solo nelle pagine che
>usano AJAX ???? Eppure ho usato un codice che sfrutta uno SCRIPTMANAGER
>generico...infatti usando quello che ho inserito per AJAX non
>funziona....

Si, devi per forza avere uno script manager nella pagina.

Comunque visto che passi il riferimento alla pagina puoi usare direttamente il metodo della proprietà ClientScript

Public Sub MostraMessaggio(ByVal P As Page, ByVal strKey As String,
ByVal strMsg As String)
P.ClientScript.RegisterStartupScript(P.GetType, strKey, "alert('"
+ strMsg + "')", True)
End Sub
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

ravalon Profilo | Expert

Ciao Marko,

ho provato a usare la proprietà ClientScript sempre nella stessa pagina che usa AJAX e non va.....va solo l'altro metodo....

tu intendevi dire che per quelle con AJAX devo usare il metodo con ScriptManager e per le altre quello con ClientScript ? oppure intendevi che ClientScript funziona sempre ?

rossimarko Profilo | Guru

>Ciao Marko,
>
>ho provato a usare la proprietà ClientScript sempre nella stessa
>pagina che usa AJAX e non va.....va solo l'altro metodo....
>
>tu intendevi dire che per quelle con AJAX devo usare il metodo
>con ScriptManager e per le altre quello con ClientScript ? oppure
>intendevi che ClientScript funziona sempre ?

Dipende dalla funzionalità inserita all'interno della pagina. Se usi Ajax allora puoi appoggiarti allo script manager, se invece non lo usi puoi usare il ClientScript, non sei obbligato ad inserire ajax per registrare lo script.

Nella documentazione (http://msdn.microsoft.com/it-it/library/bb359558.aspx) viene fornita una spiegazione sul perchè:

"Il metodo RegisterStartupScript si utilizza per registrare un blocco di script di avvio per una pagina compatibile con il rendering a pagina parziale e senza dipendenze dalla Microsoft AJAX Library. I blocchi di script di avvio registrati utilizzando questo metodo vengono inviati alla pagina solo quando il controllo che sta registrando il blocco è compreso in un controllo UpdatePanel in corso di aggiornamento. Per registrare un blocco di script di avvio ogni volta che si verifica un postback asincrono, utilizzare l'overload RegisterStartupScript(Page, Type, String, String, Boolean) di questo metodo.

Se si desidera registrare uno script di avvio che non riguarda gli aggiornamenti a pagina parziale e si desidera registrare lo script solo una volta durante il rendering della pagina iniziale, utilizzare il metodo RegisterStartupScript della classe ClientScriptManager. È possibile ottenere un riferimento all'oggetto ClientScriptManager dalla proprietà ClientScript della pagina. "
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

ravalon Profilo | Expert

Allora dato che in alcune pagine uso AJAX (dove necessario) e in altre no, userò due metodi a seconda del bisogno...

Grazie dell'aiuto come sempre !

ravalon Profilo | Expert

Ehm...la risoluzione è valida però vorrei chiedere ancora una cosa...

Se dovessi richiamare la stessa procedura da dentro una classe, quindi senza avere l'attributo di PAGE da passare....come faccio ?

rossimarko Profilo | Guru

Devi fare un metodo a cui passi il riferimento alla pagina come parametro..

Public Sub MostraMessaggio(ByVal P As Page, ByVal strKey As String,ByVal strMsg As String) P.ClientScript.RegisterStartupScript(P.GetType, strKey, "alert('"+ strMsg + "')", True) End Sub
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

ravalon Profilo | Expert

no aspetta forse non mi sono spiegato....

il metodo nella classe cls da cui chiamo a volte il MostraMessaggio non può passare il riferimento della pagina in quanto magari è una sub che inserisce i record nel DB....in questa classe ho inserito alcuni metodi standard che richiamo sempre per aprire connessioni, inserire record ecc.ecc.....come faccio a passare da qui il riferimento alla pagina ?

rossimarko Profilo | Guru

>no aspetta forse non mi sono spiegato....
>
>il metodo nella classe cls da cui chiamo a volte il MostraMessaggio
>non può passare il riferimento della pagina in quanto magari
>è una sub che inserisce i record nel DB....in questa classe ho
>inserito alcuni metodi standard che richiamo sempre per aprire
>connessioni, inserire record ecc.ecc.....come faccio a passare
>da qui il riferimento alla pagina ?

Se non riesci a passare il riferimento alla pagina allora puoi verificare l'handler della richiesta corrente:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

ravalon Profilo | Expert

l'ho testato e funziona....

pensi che possa andare bene se ad esempio sto eseguendo il codice di una procedura che sta in una classe....la procedura si occupa di instaurare la connessione col DB (quindi sono già fuori dalla pagina che ha richiamato l'evento)....a quel punto, solo per casi gravi come questo, mostro un messaggio che spiega dove sta' l'errore....

....può funzionare in questo caso ?

ravalon Profilo | Expert

Allora avrei creato 3 metodi da usare ah hoc per le 3 occasioni, ossia

Msg su Pagine con AJAX
Msg su Pagine senza AJAX
Msg da sub di una classe

Ecco il codice

Public Sub MostraMessaggioAJAX(ByVal P As Page, ByVal strKey As String, ByVal strMsg As String)
'+++ metodo per ALERT in pagine con ScriptManager (AJAX)+++
ScriptManager.RegisterStartupScript(P, P.GetType, strKey, "alert('" + strMsg + "')", True)

End Sub

Public Sub MostraMessaggioNormale(ByVal P As Page, ByVal strKey As String, ByVal strMsg As String)
'+++ metodo per ALERT in pagine senza ScriptManager (NORMALI)+++
P.ClientScript.RegisterStartupScript(P.GetType, strKey, "alert('" + strMsg + "')", True)
End Sub

Public Sub MostraMessaggioDaClasse(ByVal PageHandl As Page, ByVal strKey As String, ByVal strMsg As String)
'+++ metodo per ALERT da richiamare da procedure interne a classi +++
If TypeOf (PageHandl) Is Page Then
Dim myPage As Page = DirectCast(PageHandl, Page)
myPage.ClientScript.RegisterStartupScript(myPage.GetType, strKey, "alert('" + strMsg + "')", True)
End If
End Sub

Ora per spiegarmi meglio dove sta il problema....

sta nel fatto che non so sempre a priori se il messaggio dovrà essere usato in una pagina che sfrutta AJAX o meno nel caso dei messaggi richiamati da una sub di una classe....
Ad esempio....in questa classe ho un metodo universale per il sito che carica le ComboBox....

Ecco....queste combobox vengono caricate con questa procedura sia in pagine che hanno AJAX, sia in pagine che non ne fanno uso....
Per cui come faccio a capirlo e richiamare la MostraMessaggio giusta per l'occasione ??

rossimarko Profilo | Guru

>pensi che possa andare bene se ad esempio sto eseguendo il codice
>di una procedura che sta in una classe....la procedura si occupa
>di instaurare la connessione col DB (quindi sono già fuori dalla
>pagina che ha richiamato l'evento)....a quel punto, solo per
>casi gravi come questo, mostro un messaggio che spiega dove sta'
>l'errore....
>
>....può funzionare in questo caso ?

Io sinceramente non sposterei la logica di visualizzazione degli errori all'interno delle procedure applicative. Se ad esempio hai una procedura che salva i dati sul db l'errore del tentativo di connessione fallito non deve essere intercettato nella procedura ma deve essere riportato a chi chiama la funzione
Quindi o intercetti l'errore con un try catch e poi lo riporti al chiamante oppure non inserisci il try catch e quindi gli errori non gestiti vengono riportati al livello sopra.

La visualizzazione dell'errore con un messaggio personalizzato la gestirai nella pagina dove fai la chiamata:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

ravalon Profilo | Expert

Chiaramente utilizzo il try catch ma per molte procedure l'ho inserito dentro alla procedura stessa....poichè fanno da procedure generiche, in modo da riutilizzare e ottimizzare il più possibile il codice, le utilizzo anche in casi come quello che ti ho detto del caricamento delle combobox... non è che ogni volta che carico una combo posso fare un try catch per cui richiamo la procedura CaricaComboBox(...) che si occupa anche di intercettare gli errori....

tornando all'ultimo esempio dei 3 metodi che ho postato, non c'è un modo per capire se l'httpcontext.current di cui mi hai indicato l'uso riporta ad una pagina che usa AJAX o meno ?

rossimarko Profilo | Guru

Questo metodo forse può esserti utile: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.getcurrent.aspx

Se ti ritorna un'istanza allora lo scriptmanager è inserito nella pagina

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

ravalon Profilo | Expert

Ho provato a usarlo in questo modo

Dim returnvalue As ScriptManager
returnvalue = ScriptManager.GetCurrent(P)
If returnvalue Is Nothing Then
'+++ metodo per ALERT in pagine senza ScriptManager (NORMALI)+++
P.ClientScript.RegisterStartupScript(P.GetType, strKey, "alert('" + strMsg + "');", True)
Else
'+++ metodo per ALERT in pagine con ScriptManager (AJAX)+++
ScriptManager.RegisterStartupScript(P, P.GetType, strKey, "alert('" + strMsg + "');", True)
End If

Il returnvalue funziona e mi dice se c'è o meno uno scriptmanager...

ho dovuto aggiungere ";" alla fine dell'istruzione simulata del JS altrimenti non mostrava il messaggio....

Per ora l'ho testato solo nelle pagien che hanno AJAX, domani (ora non posso scusate) lo provo su tutto il resto e poi vi faccio sapere...

Grazie come sempre Marko....
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5