Lanciare Funzione serverSide da uno script JavaScript

mercoledì 11 giugno 2008 - 12.43

ridaria Profilo | Expert

Cari amici, è possibile lanciare una Funzione serverSide tipo: sub MyFunction () da uno script latoClient JavaScript??


Grazie

Riccardo

Ridaria

Wamba Profilo | Expert

Si può grazie ad Ajax.NET ed i webmethods.
Si tratta di metodi lato server opportunemente decorati di tipo public. Possono restituire void, semplici variaibli o classe complesse, l'unico vincolo è che siano serializzabili. Io gli ho trovati utilissimi.
PS:Ricorda che sono asincroni.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

Hai del codice da postarmi?

o un link dove leggere qualcosa?


Grazie
Ridaria

Wamba Profilo | Expert

Scusa il ritardo nella risposta, ma sai: cibo, bigliardino... dai un'occhiata qui:http://msdn.microsoft.com/it-it/library/byxd99hx(VS.80).aspx

-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

mentre do un occhiata li, bigliardino???????? in pausa pranzo giocate a bigliardino????? se si è una figata!
Ridaria

Wamba Profilo | Expert

Ognuno ha i suoi piccoli grandi vizzi . Andiamo ad un bar qui vicino e per un'oretta ci diamo dentro.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

grazie per il link, ma ci vorrebbe troppo tempo adesso per studiarmi tutto, non hai un po di codice con una funzione javaScript che mi lanci una beneddetta sub serverside


Grazie

Ridaria

Wamba Profilo | Expert

Non posso postartelo perchè materiale aziendale:
Facciamo così:
1) Metti lo scriptManager nella pagina
2) using System.Web.Services; //Reference Fondamentale per la decorazione [WebMethod()]
3) Scrivi questo metodo lato server:
[WebMethod()]
public static string Now()
{
throw new DivideByZeroException();
//return DateTime.Now.ToString();
}
4) Lato client:
function LeggiDataOra()
{
PageMethods.Now(ScriviData, OnError);
}

function ScriviData(result)
{
document.getElementById("RisultatoDataOra").innerHTML = result;
}

function OnError(error, userContext, methodName)
{...}
5) Chiama LeggiDataOra ed al termine della chiamata viene chiamato: Scrivi data quando il metodo viene eseguito correttamente altrimento onError.

Se la tua funzione server ha dei parametri questi devono essere scritti così
PageMethods.NomeFunzioneServer(par1,par2,par3,..., FunzioneDaChiamareQuandoFinito, FunzioneDaChiamareInCasoDiErrore);

Spero ti basti

-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

io ti ringrazio, ci provo, ma volevo dirti che la funzione che devo lanciare ha ad oggetto una serie di azioni sul database, e per la precisione la cancellazione di un record dal DB e la eliminazione di un file di immagine che risiede sempre sul server.


Si può fare ciò oppure posso solo leggere data e ora dal server????



Grazie
Riccardo
Ridaria

Wamba Profilo | Expert

La funzione che legge data e ora è solo a titolo di esempio.
La parte interessante della cosa è come fare a far comunicare client e server senza eseguire postback. Una volta sul server puoi fare quello che vuoi, ma ricordati che sei in una funzione statica e non hai postato il viewstate quindi non hai accesso ai controlli. Anche accedere alla Session/application ecc. non è così immediato: devi usare HTTPContext.Current.Session.
Paricolare attenzione ad associare funzioni così potenzialmente dannose ad una chiamata JS. Dovrai prendere tutte le dovute precauzioni di sicurezza.
Come disse Dino Esposito [sua maestà] spiegandoci i webMethods ad un corso (citando SpiderMan) "a grande potere corrisponde grande responsabilità".
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

mi dice che:

PageMethods is not defined
LeggiDataOra()riccardo.aspx (line 12)
onclick(click clientX=0, clientY=0)riccardo.aspx (line 1)
[Break on this error] PageMethods.Now(ScriviData, OnError);

Ma quel santissimo WebMethod dove lo devo mettere??
Io lo ho messo nella sezione di codice server side della pagina uno spezzone lo vedi qui sotto:
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Drawing.Drawing2D
Imports System.Web.Services
Partial Class Riccardo
Inherits System.Web.UI.Page

Public Shared Function Now() As String
Throw New DivideByZeroException
End Function

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click


Dim connString As String = ConfigurationManager.ConnectionStrings("STR_CONN").ConnectionString .... eccccccc

end sub

Ridaria

Wamba Profilo | Expert

esattamente dov'era sopra il metodo.
Domanda: ho parlato di decoraizioni di metodi, sai cosa sono?
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

no, purtroppo no questo argomento dei webMetho mi è del tutto sconosciuto ed anche le decorazioni lo sono


Ridaria

Wamba Profilo | Expert

Tranquillo:
Per farla molto semplice: Le decorazioni sono informazioni aggiuntive che dai al compilatore sul metodo.
Quella che ho scritto io è in c# in vb dovrebbe essere <WebMethod()> e vanno scritte subito sopra il metodo (in Vb devono essere seguite da _ altrimenti da errore)
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

UFFFFFFFFFFFFFFFFFFFFFFFFFFF

ti posto il pezzo di script ed il pezzo di codice server side!

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<link rel="stylesheet" type="text/css" href="../App_Themes/position.css"/>
<script language ="javascript" type="text/javascript" src ="../javaScript/JScript.js" >
</script>
<script language="javascript" type ="text/javascript" >
function LeggiDataOra()
{
PageMethods.Now(ScriviData, OnError);
}

function ScriviData(result)
{
document.getElementById("RisultatoDataOra").innerHTML = result;
}

function OnError(error, userContext, methodName)
{
//...
}

</script>


Server side:

Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Drawing.Drawing2D
Imports System.Web.Services

Partial Class Riccardo
Inherits System.Web.UI.Page
<WebMethod()> _
Public Shared Function Now() As String
Throw New DivideByZeroException
End Function


Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim connString As String = ConfigurationManager.ConnectionStrings("STR_CONN").ConnectionString
Dim conn As New SqlConnection(connString)
Dim i As Integer = 0

Dim SqlStr As String = "SELECT nome FROM [RegioniDelMondo]"

Dim dt As New DataTable .............. eccc
end sub

Mi da sempre lo stesso errore:
PageMethods is not defined
LeggiDataOra()riccardo.aspx (line 11)
onclick(click clientX=0, clientY=0)riccardo.aspx (line 1)
[Break on this error] PageMethods.Now(ScriviData, OnError);

Tra un pò scasso la tastriera!
Grazie ancora

Ridaria

Wamba Profilo | Expert

ehm... temo di essermi dimenticato un dettaglio.....
devi mettere anche l'attributo EnablePageMethods="true" nello script manager... Scusa me ne dimentico sempre :(
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

la avevo fatto, trovato in giro da Sorcinelli.

Ma comunque la data non me la visualizza ed al secondo click sul bottone, mi attacca in fondo alla pagina la stessa Pagina, e via di seguito, tipo:
6 click, mi renderizza sei volte la pagina una sotto all'altra..........................

RiccaRDO
Ridaria

ridaria Profilo | Expert

ho fatto un alert nella funzione:
function ScriviData(result)
{
document.getElementById("RisultatoDataOra").innerHTML = result;
alert(result)
}

e sai cosa mi ha restituito:

Tutto l'html della Pagina!"!!!!!!

Cosa accade?

Ridaria

Wamba Profilo | Expert

aspè hai inserito un asp:button che potrebbe farti il postback?
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

esatto, ci vuole un controllo html classico?

ci provo subito!

Ridaria

ridaria Profilo | Expert

messo il button classico html e adesso mi da "Undefined"
Ridaria

Wamba Profilo | Expert

No ci vuole di non eseguire il postback
Ovvero se metti un <input type="button"> tutto bene
se usi un <asp:button onclientclick="leggiora();return false;" />
(con il return false eviti il postback.). E' meglio non usare i controlli server quando non servono.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

Wamba Profilo | Expert

Non hai lascito il throw exception dell'esempio (ho visto che lo hai ripostato)?
Hai provato a mettere un breakpoint nella funzione lato server per vedere cosa restituisce?
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

intendi un punto di interruzione, quelli per il debug????????

non posso, lavoro direttamente sul server.

devo togliere il Throw New DivideByZeroException,

e poi che ci azzecca un controllo su operazioni di divisione per zero? se sto leggendo un valore sul server?

Riccardo


Ridaria

Wamba Profilo | Expert

Non è un controllo, ma un lancio di eccezione vera e propria. Se hai visto nel codice che ti ho postato c'erano due righe: una restituiva il valore, l'altra un'eccezione. Serviva per mostrare entrame le possibilità. DivisionByZero è stata scelta più o meno a caso, tanto per lanciarne una.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

ecco cosa ho scritto adesso:

<script language="javascript" type ="text/javascript" >
function LeggiDataOra()
{
PageMethods.Now(ScriviData, OnError);
}

function ScriviData(result)
{
document.getElementById("RisultatoDataOra").innerHTML = result;
alert(result)
}

function OnError(error, userContext, methodName)
{
alert(error)
}

</script>

<script runat="server">
<System.Web.Script.Services.ScriptMethod(), System.Web.Services.WebMethod()> _
Public Shared Function Now() As String
Return "CIAO"

'Throw New DivideByZeroException

End Function
</script>

Mi restituisce undefined.

Il bottone ed il div li ho messi in un updatePanel di uno ScriptManager.

Riccardo
Ridaria

ridaria Profilo | Expert

se devi andare via dimmelo che vado anche io, se non risolvo sta cagata non ho altro da fare!!!!!!!!!!!!!!!!!!!!

Ridaria

Wamba Profilo | Expert

>ecco cosa ho scritto adesso:
>
><script language="javascript" type ="text/javascript" >
>function LeggiDataOra()
>{
>PageMethods.Now(ScriviData, OnError);
>}
>
>function ScriviData(result)
>{
>document.getElementById("RisultatoDataOra").innerHTML = result;
>alert(result)
>}
>
>function OnError(error, userContext, methodName)
>{
>alert(error)
>}
>
></script>
>
><script runat="server">
><System.Web.Script.Services.ScriptMethod(), System.Web.Services.WebMethod()>
>_
> Public Shared Function Now() As String
> Return "CIAO"
>
> 'Throw New DivideByZeroException
>
> End Function
></script>
>
>Mi restituisce undefined.
>
>Il bottone ed il div li ho messi in un updatePanel di uno ScriptManager.
>
>Riccardo
>Ridaria

Perchè un updatepannel? toglilo.
Hai inserito un div con id="RisultatoDataOra"?
System.Web.Script.Services.ScriptMethod() ? Perchè?
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

Non FUNZIONA!!!!!!!!!

Avremo fatto prima se mi avessi inviato un pezzo di codice TUO funzionante!


Ridaria

Wamba Profilo | Expert

Ti ho spiegato che non posso e ti ho mandato tutti i pezzi di codice necessari. Mi sembra di essere qui ad aiutarti nello sviluppo passo passo.
Continua a darti undefined?
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

si continua a darmi Undefined, ho messo il bottone ed il div fuori dall'update panel:

<input id="Button7" type="button" value="button" onclick="ScriviData()" /><br />
<div id="RisultatoDataOra" style="border-color:Fuchsia ; border-width :medium " >data:
</div>



e questo è lo script:

<script runat="server">
<System.Web.Script.Services.ScriptMethod(), System.Web.Services.WebMethod()> _
Public Shared Function Now() As String
Return "CIAO"

'Throw New DivideByZeroException

End Function
</script>
<script language="javascript" type ="text/javascript" >
function LeggiDataOra()
{
PageMethods.Now(ScriviData, OnError);
}

function ScriviData(result)
{
document.getElementById("RisultatoDataOra").innerHTML = result;
alert(result)
}

function OnError(error, userContext, methodName)
{
alert(error)
}

</script>


ho messo:
<System.Web.Script.Services.ScriptMethod(), System.Web.Services.WebMethod()> _
perché se metto solo: <WebMethod()> _ me lo sottolinea blu.

Cmq Grazie, speriamo di riuscirci.

Ridaria

Wamba Profilo | Expert

Puoi tradurre "me lo sottolina blu" con il messaggio di errore?
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

Wamba Profilo | Expert

Vado a casa sono fuso .
Ci sentiamo domani. Se qualcuno stasera legge e può aiuti pure
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

ridaria Profilo | Expert

le ho provate tutte, ma scusa se tu mi prendio i pezzi di codice che usi, ci toghli ogni riferimento a chi o che cosa, lo rendi puro, così che io non sappia da dove cavolo arriva, cosa cambia ?

Cmq ciò che mi stai dicendo deriva da ciò che hai già scritto no???

Grazie
riccardo

Ridaria

ridaria Profilo | Expert

Risolto, non so se il tuo codice postatomi ieri era completo, ma ho seguito gli esempi presi su
http://asp.net/AJAX/Documentation/Live/tutorials/ExposingWebServicesToAJAXTutorial.aspx

e ho risolto. L'esempio che ho preso "è un pò diverso dai tuoi suggerimenti", c'è un file .asmx da impostare e richiamare questo file dallo script manager etcccc,

Comunque, Grazie infinite per l'attenzione.

Riccardo
Ridaria

Wamba Profilo | Expert

Quello che hai usato è un WebServices al posto di un WebMethod. Sono [sempre semplificando] più o meno la stessa cosa. La differenza fondamentale è che i WebMethod funzionano solo all'interno della pagina e danno margini di sicurezza maggiori.
Sono contento che tu abbia risolto.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5