44 messaggi dal 19 giugno 2001
Ho creato un oggetto utile per gestire l'invio mail di un form web (un FormMail per intenderci).
Nella pagina aspx che viene chiamata da un semplice modulo html scrivo il seguente codice:
<script runat="server">
Sub Page_Load(Sender As Object, E As EventArgs)
Dim objFormMail As New FormMail
objFormMail.Campi = Request.Form
If objFormMail.Invia() Then
'L'invio ha successo
Response.Redirect(objFormMail.Link)
Else
'Se invece c'è qualcosa che non va...
lblAvviso.Text = objFormMail.Errore
End If
End Sub
</script>
L'oggetto non mi dà nessun problema se lo inserisco in un file vb code-behind.
Se invece lo compilo in una dll mi dà il seguente errore:
Object reference not set to an instance of an object.
L'errore si riferisce alla quinta riga, ossia quella che richiama il metodo Invia()
Perché? L'oggetto denominato objFormMail è regolarmente istanziato 2 righe prima: infatti la proprietà Campi funziona a dovere. E perché l'identico codice, se istanzia il medesimo oggetto dal file code-behind, non mi dà errore?
Grazie

Paolo
44 messaggi dal 19 giugno 2001
Passo in avanti:
Ho individuato all'interno dell'oggetto il problema. Ho bisogno di usare il metodo URLDecode dell'oggetto Server. Se inserisco quindi il codice:
dim strValoreCampo As String = Server.UrlDecode(arrTestoProvvisoria(1))
nel file Code-Behind e opportunamente faccio l'import:
Imports System.Web.UI.WebControls 'questo serve per Server.URLDecode
tutto funziona a dovere.
Se opero allo stesso modo nel file vb da compilare, il compilatore mi dà l'errore: Server is not declared. In altri termini crede sia il nome di una variabile: l'imports non è quindi sufficiente. Per risolvere nella dll debbo operare così:
dim objServer As HttpServerUtility
dim strValoreCampo As String = objServer.UrlDecode(arrTestoProvvisoria(1))
Questo non mi dà errore in fase di compilazione, ma appunto mi produce l'errore di istanziamento dell'oggetto nella pagina aspx.
Innanzitutto è un vero tormento il dover combattere con queste differenze tra una classe inserita in un file code-behind e in un file da compilare (sembra che si debba parlare 2 lingue leggermente differenti: un vero casino). E poi, come risolvere ?

Paolo
E' solo una questione di riferimenti alla classe.
Quando usi il codebehind stai scrivendo una classe che eredita da Page. Questa classe ha certe proprietà per mantenere una certa "compatibilità" con ASP.
Quando fai in Server. in realtà stai accedendo all'HttpContext.Current.Server di tipo HttpServerUtility.
Il metodi UrlEncode non fa altro che richiamare a sua volta HttpUtility.UrlEncode (metodo statico).
Quando ti trovi in una tua classe che non eredita da Page la proprietà Server non ce l'hai più. Quindi usa sempre
HttpUtility.UrlEncode
che non ti sbagli mai

Ciao

Il mio blog
Homepage
44 messaggi dal 19 giugno 2001
Grazie, risolto.
C'ero quasi arrivato ... ma sbagliavo nel creare un oggetto HttpServerUtility e quindi applicare a quell'oggetto il metodo URLDecode. Molto più semplicemente si deve sostiruire Server con HttpUtility e tutto funziona. So delle differenze di un Code-Behind che eredita da Page, rispetto ad un file da compilare da zero. Ma ancora le tante differenze mi inceppano parecchio e perdo una quantità di tempo ignobile. Ma qualche buon libro o articolo sull'argomento specifico ? Di tipo molto pratico, così, per chi ha già le idee teoriche abbastanza chiare ma non ha ancora le tante differenze pratiche sotto mano, possa fargli risparmiare tempo in lunghe ricerche e test?

Paolo
Non ne conosco a riguardo di questo problema.
Io ti consiglio di vedere proprietà e metodi della classe Page e vedere come lavorano, magari con un reflector.

Ciao

Il mio blog
Homepage

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.