Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Problema pesante con asp.net e ajax...

    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 senderEventArgs 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==|| 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 senderEventArgs 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.
    Lupo
    ----

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    ho fatto delle prove, come questa, per esempio:

    pagina:
    codice:
    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="semplice_ajax_1.aspx.vb" Inherits="CorsoApogeo_ajax_semplice_ajax_semplice_ajax_1" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Pagina senza titolo</title>
        <link href="../../../stili/Styles.css" rel="stylesheet" type="text/css" />
        <script type="text/javascript" src="../../../js/ajax.js"></script>
        <script language="javascript" type="text/javascript">
    // <!CDATA[
    
    //non utilizzo la funzione crea_parametri
    function a1_onclick(v)
    {
        var parametri = $("__EVENTTARGET").name + "=" + v.id
                + "&" + $("__EVENTARGUMENT").name + "=" + ""
                + "&" + $("__VIEWSTATE").name + "=" + encodeURIComponent($("__VIEWSTATE").value)
                + "&" + $("__EVENTVALIDATION").name + "=" + encodeURIComponent($("__EVENTVALIDATION").value);
        
        parametri += "&" + $("Text1").name + "=" + encodeURIComponent($("Text1").value);
                        
                        
        ajax("?", onload, parametri);
        function onload()
        {
    		var t = this.request.responseText;
    		//var tx = this.request.responseXML;
            $("div1").innerHTML = t;
        }
    
    }
    
    
    // ]]>
        </script>  
    </head>
    <body>
        <form id="form1" runat="server">
            <input id="Text1" type="text" name="Text1" style="width: 448px;border:1px black solid;" value="v1=1&v2=1+2" />
            
    
            Richiama data server tramite ajax
            
    
            
            
    
    
            <div id="div1"></div>
        </form>
    </body>
    </html>
    codice:
    codice:
    Option Strict On
    
    Partial Class CorsoApogeo_ajax_semplice_ajax_semplice_ajax_1
        Inherits System.Web.UI.Page
    
        Protected Sub a1_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles a1.ServerClick
            'Me.Response.Write(DateTime.Now.ToString())
            Me.Response.Write("Me.IsPostBack = " & Me.IsPostBack & ", " & DateTime.Now.ToString())
            Me.Response.Write("
    
    ")
            Me.Response.Write(libreria.getForms())
            Me.Response.End()
        End Sub
    
    
        Protected Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
            Dim ex As Exception = Server.GetLastError()
            Me.Response.Write(ex.Message)
            Me.Response.End()
        End Sub
    
    End Class

    qualche spiegazione:
    la pagina ha il link a1 runat server. Al click parte l'evento a1_onclick che fa la richiesta al server tramite chiamata ajax in modalità post. Oltre ad inviare il testo in Text1, invio pure gli hidden nascosti, __EVENTTARGET, __EVENTARGUMENT, __VIEWSTATE, __EVENTVALIDATION.
    Il server fa partire correttamente l'evento a1_ServerClick e restituisce al chiamante:
    IsPostBack
    DateTime.Now.ToString(),
    getForms() ->listato dei parametri form ricevuti, per assicurarmi che vengano ricevuti

    Sembra che funzioni, però, detto tra me e te, non lo uso mai. Uso sempre il modo antico, ossia ricavo i parametri form ricevuti e li uso come voglio.
    In pratica richiamo da client la pagina con una sintassi simile:

    pagina.aspx?comando_ajax=recupera_dati

    nel server recupero il parametro comando_ajax, lo valuto e proseguo, più o meno come hai scritto tu nella prima parte. Funziona sempre e lascia molta più libertà.
    Pietro

  3. #3
    Prima di tutto grazie infinite.
    Analizzerò con calma il tuo script.
    Grazie ancora!
    Francesco!
    Lupo
    ----

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.