Salve a tutti, cerco di spiegare il mio problema con un esempio.
Facciamo che ho una pagina aspx, la classica pagina pippo.aspx
Codice PHP:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="pippo.aspx.cs" Inherits="_pippo" %>
<head runat="server">
<title>Pippo</title>
</head>
<body>
<form id="form1" runat="server">
<input type="text" id="messaggio" runat="server">
<div id="testoMessaggio" runat="server">
</div>
</form>
<script type="text/JavaScript">
// qui metto l'ajax che mi serve.
</script>
</body>
</html>
questo il codice per pippo.aspx.cs
Codice PHP:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["sid"] != null)
{
Response.Write(Request.Form["messaggio"]);
Response.End();
}
}
}
E fin qui direi che ci siamo.
Adesso aggiungo un pulsante stampa messaggio alla pagina pippo.aspx...
Codice PHP:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="pippo.aspx.cs" Inherits="_pippo" %>
<head runat="server">
<title>Pippo</title>
</head>
<body>
<form id="form1" runat="server">
<input type="text" id="messaggio" runat="server">
<div id="testoMessaggio" runat="server">
</div>
<input type="button" id="invia" value="stampa messaggio" onclick="get_messaggio()" />
</form>
<script type="text/JavaScript">
// qui metto l'ajax che mi serve.
</script>
</body>
</html>
La funzione get_messaggio è una funzione javascript/ajax che dovrebbe prendere il contenuto di messaggio, inviarlo in post alla pagina e stampare la risposta nel div testMessaggio.
la funzione get_messaggio() è così concepita:
Codice PHP:
function get_messaggio()
{
xmlHttp=GetXmlHttpObject(); // chiamata ad un js esterno. Istanzia l'oggetto xmlHttp come oggetto XmlHttpObject();
if (xmlHttp==null)
{
// il browser non supporta xmlHttpRequest
return;
}
else
{
var url="?sid="+Math.random(); // richiama la pagina pippo.aspx con un parametro random...
var data = "";
var header="Content-Type:application/x-www-form-urlencoded; charset=UTF-8"; // <-- header
data = "messaggio=" + document.getElementById("messaggio").value; // il dato da passare in post tramite ajax è il contenuto di messaggio
xmlHttp.onreadystatechange=messaggio;
xmlHttp.open("POST",url,true);
xmlHttp.setRequestHeader(header.split(':')[0],header.split(':')[1]);
xmlHttp.send(data);
}
}
function messaggio()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
{
var testo_messaggio = xmlHttp.responseText;
document.getElementById("testoMessaggio").innerHTML = testo_messaggio;
}
}
ok, facendo "girare" la pagina questa fa quel che voglio, ovvero se l'utente scrive nel campo di testo "ciao mondo" e preme il pulsante "stampa messaggio" la funzione get_messaggio recupera il valore del campo input "messaggio" e lo invia in POST alla pagina pippo medesima, assieme ad un parametro random (in querystring) sid. La pagina pippo.aspx individua un valore di sid != null e pertanto, stampa il valore passato in post di "messaggio". Questo valore viene recuperato dalla funzione messaggio che lo stampa lato client. Tutto ok.
Qui sorge la domanda.
Poniamo di effettuare questa modifica al codice lato server di pippo.aspx.cs
Codice PHP:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["sid"] != null)
{
// Response.Write(Request.Form["messaggio"]);
Response.Write(messaggio.Value);
Response.End();
}
}
}
IN questo caso il "giochino" non funziona più... ovvero non riesco a leggere il valore di messaggio attraverso la classica notazione messaggio.Value ma soltanto utilizzando la notazione Request.Form["messaggio"].
Ho pensato di poter risolvere il problema passando in post, tramite ajax, oltre al campo messaggio anche i campi nascosti di sistema __EVENTTARGET, __VIEWSTATE e __EVENTARGUMENT, quindi la funzione assume questa forma:
Codice PHP:
function get_messaggio()
{
xmlHttp=GetXmlHttpObject(); // chiamata ad un js esterno. Istanzia l'oggetto xmlHttp come oggetto XmlHttpObject();
if (xmlHttp==null)
{
// il browser non supporta xmlHttpRequest
return;
}
else
{
var url="?sid="+Math.random(); // richiama la pagina pippo.aspx con un parametro random...
var data = "";
var header="Content-Type:application/x-www-form-urlencoded; charset=UTF-8"; // <-- header
data = ""
+ "messaggio=" + document.getElementById("messaggio").value
+ ";__EVENTTARGET=" + document.getElementById("__EVENTTARGET").value
+ ";__VIEWSTATE" + document.getElementById("__VIEWSTATE").value
+ ";__EVENTARGUMENT" + document.getElementById("__EVENTARGUMENT").value;
xmlHttp.onreadystatechange=messaggio;
xmlHttp.open("POST",url,true);
xmlHttp.setRequestHeader(header.split(':')[0],header.split(':')[1]);
xmlHttp.send(data);
}
}
in questo caso, però, quello che ottengo come risposta dalla mia funzione ajax è il seguente messaggio:
----------------------
Server Error in '/' Application.
--------------------------------------------------------------------------------
Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.
--------------------------------
... boh!? Che vor di?!
Qualcuno sa darmi un aiuto? Come posso fare in modo che, richiamando la pagina mediante un post di ajax, io possa leggere il valore di pippo semplicemente utilizzando un pippo.Value anziche un Request.Form["pippo"]? Parrebbe una domanda oziosa ma poter fare in un modo piuttosto che in un altro vorrebbe dire risparmiarmi la ri-scrittura di centinaia di righe di codice.
Grazie a tutti per l'aiuto.
Francesco.