Avatar billede kennedk Nybegynder
24. november 2007 - 11:19 Der er 28 kommentarer og
1 løsning

Ajax UpdatePanel fejl

hej Ekeperter
jeg sidder og leger med lidt ajax.
Jeg sidder og laver et lille CMS system til privat forbrug.
Jeg har to updatepanels på min hjemmeside, en til min menu, og en til mit indhold, som er i UserControls der bliver loadet i en placeholder

Jeg har lavet en funktion i javascript som jeg kan køre når jeg vil ændre indholdet i det ene updatepanel

function postBackIndhold(side,id) {
    var hiddenField = $get("<%=HiddenFieldToUpdateIndhold.ClientID %>");
    if (hiddenField) {
    if(document.cookie =  "postback=false; path=/;"){
        hiddenField.value = side + ";" + id;
     
        __doPostBack("<%=HiddenFieldToUpdateIndhold.ClientID %>",'');
    }
    }
}

Det virker fint, men første gang siden loades kommer der Nogen gange en fejl, når ma trykker på et link, der bruger den overstående javascript funtion

http://webint.dk/AjaxFejl.jpg

Hvis manb trykker "OK" til den fejl, og trykker på det samme link, så kommer der ingen fejl, og det virker.

Men hvordan slipper jeg af med den fejl, jeg har kæmpet og kæmpet.

Jeg forstår ikke fejlen, men jeg kan udelukke en af dem, da jeg IKKE bruger Response.Write() nogen steder på hjemmesiden

Det vil vær een stor hjælp hvis der er en der kender en løsning.
På forhånd tak.
Avatar billede Slettet bruger
24. november 2007 - 12:04 #1
Tja den fejl er bare generel. Kan du ikke debugge dig frem til fejlen ? Prøv evt. at benytte firefox's error-console og se om du ikke kan spore den der..
Avatar billede kennedk Nybegynder
24. november 2007 - 12:50 #2
Nu har jeg kigget i fejlkonsollen, når fejlen opstår, og der kommer ingen fejl frem.

Jeg ved virkelig ikke hvad det kan være?
Avatar billede neoman Novice
24. november 2007 - 13:03 #3
I stedet for at fejlsøge ville jeg foreslå dig at bruge en velafprøvet metode til at trigge postback fra js kode:

1. Lav en knap med style="display:hidden" ' så er den ikke synlig på web siden
2. Lav en js-funktion som klikker på knappen:
  Hvis den hedder myButton så :
    function myTrigger(){
        document.GetElementById("<%=myButton.ClientID %>").click;
    }

3. Læg knappen inde i det updatepanel som skal opdateres, eller læg den udenfor og i så fald deklarer den som async trigger for panelet

4. Lav noget kode som lægger info i noget hidden field (ganske som du har nu), og lad denne kode kalde myTrigger

Når du gør det sådan, så bruger du hele den indbyggede mekanik, og det funker. Jeg selv har droppet at slåsse med __doPostback netop fordi jeg også fik fejl.
Avatar billede neoman Novice
24. november 2007 - 13:07 #4
faktisk burde du kunne erstatte din __doPostback("..HiddenField blabla") med MyTrigger - når triggerknappen er der
Avatar billede kennedk Nybegynder
24. november 2007 - 14:00 #5
Nu har jeg siddet og leget lidt med det
og lavet denne function
function postBackIndhold(side,id) {
    var hiddenField = $get("<%=HiddenFieldToUpdateIndhold.ClientID %>");
    if (hiddenField) {
    if(document.cookie =  "postback=false; path=/;"){
        hiddenField.value = side + ";" + id;
     
        document.getElementById("<%=btnToUpdate.ClientID %>").click();
    }
    }
}

Men det virker ikke som det skal, for den laver et postback på siden. altså hele siden reloades..
Avatar billede neoman Novice
24. november 2007 - 14:04 #6
hvor er din button ? ligger den inde i panelet som skal opdateres eller udenfor ? hvis den ligger udenfor så skal den være defineret som asynctrigger for panelet

og er det en html knap eler en asp:button ? Jeg plejer at bruge <asp:button og tillige sætte dens UseSubmitBehavior=False
Avatar billede kennedk Nybegynder
24. november 2007 - 14:07 #7
UseSubmitBehavior=False gjorde så det virkede, nu skal jeg lige have testest om den underlige fejl kommer! :)
Avatar billede kennedk Nybegynder
24. november 2007 - 14:10 #8
Nu har jeg testet lidt, og det viser sig at fejlen stadig dukker op.
Hvordan dælen kan det være?
Avatar billede neoman Novice
24. november 2007 - 14:14 #9
aner det ikke - der foregår åbenbart andet i din kode
kig her:
http://weblogs.asp.net/leftslipper/archive/2007/02/26/sys-webforms-pagerequestmanagerparsererrorexception-what-it-is-and-how-to-avoid-it.aspx
eller smid "pagerequestmanagerparsererrorexception" ind i google og kig på hvad folk oplever med den meddelelse
Avatar billede neoman Novice
24. november 2007 - 14:17 #10
og så kan du i øvrigt bruge binær fejlsøgning - kommentere halvdelen af din kode ud, og hvis fejlen stadig dukker op så ligger den i den ikke-udkommenterede del - og så kommenterer man igen det halve af koden ud. PÅ få steps kan man finde ud af hvad årsagen er.
Avatar billede kennedk Nybegynder
24. november 2007 - 14:18 #11
Nu ser jeg her, og kigger på server trace.
hvad er det? og hvordan slår jeg det fra? Det kan jo ske det er det.
Avatar billede neoman Novice
24. november 2007 - 14:21 #12
hvis du ikke selv har slået det til så har du det ikke
Avatar billede neoman Novice
24. november 2007 - 14:25 #13
"kommer der Nogen gange en fejl, når ma trykker på et link" - "nogen" antyder så at der sker andre ting i din kode som trigger fejlen- så jeg ville foreslå at bruge den binære fejlsøgning for at finde ud af hvad det er
Avatar billede kennedk Nybegynder
24. november 2007 - 14:25 #14
Jeg kom til at se at jeg har dette httpModul inde jeg har lavet mig..
Kan du se om det kan lave en fejl?


using System;
using System.Web;
using CMS.Users;

namespace CMS.Web.Handlers
{
    public class AuthenticationModule : IHttpModule
    {
        public AuthenticationModule()
        {
        }
        public void Init(HttpApplication app)
        {
            // Register our event handler with Application object.
            app.AuthenticateRequest += new EventHandler(this.AuthenticateRequest);
        }

        public void Dispose()
        {
            // Left blank because we dont have to do anything.
        }

        private void AuthenticateRequest(object sender, EventArgs eventArgs)
        {
            HttpApplication app = (HttpApplication)sender;
            HttpContext context = (HttpContext)app.Context;

            HttpCookie authCookie = context.Request.Cookies["auth"];
            if (authCookie != null)
            {
                try
                {
                    string username = authCookie.Values["name"];
                    if (!String.IsNullOrEmpty(username))
                    {
                        User user = User.GetUser(username);
                        if (user != null)
                        {
                            context.Items["isAuthenticated"] = true;
                            context.Items["User"] = user;
                        }
                        else
                        {
                            context.Request.Cookies["auth"].Expires = DateTime.Now.AddYears(-30);
                        }
                    }
                }
                catch
                {
                    context.Response.Cookies["auth"].Expires = DateTime.Now.AddYears(-30);
                }
            }
        }
    }
}
Avatar billede neoman Novice
24. november 2007 - 14:32 #15
Nej det kan jeg ikke.

Men den snakker da med din side i og med at den lægger en cookie, så det kunne godt være det.

Du kunne udkommentere
context.Request.Cookies["auth"].Expires = DateTime.Now.AddYears(-30);

og så tillade uautoriserede brugere at bruge siden og se om det så hjælper.

forstår i øvrigt ikke helt hvad DateTime.Now.AddYears(-30) gør - at sætte en cookie som er udløbet for 30 år siden ??
Avatar billede neoman Novice
24. november 2007 - 14:36 #16
context.Items lægger også noget til siden , såå du ku prøve at kommentere det hele uf og så se
Avatar billede kennedk Nybegynder
24. november 2007 - 14:46 #17
Det er min kammerat der har kodet den, men ud fra at læse den , så kan jeg da forestille mig at det er for at slette cookien.
Men jeg har prøvet at slette modulet fra config, og det giver ingen forskel.

Og fordi siden har haft den fejl hele tiden sidder jeg med en mindre sider som heller ikke bruger det modul endnu.

Skal jeg prøve at oprette siden fra ny endnu en gang. er det det nemmeste?
Avatar billede neoman Novice
24. november 2007 - 14:48 #18
"Men jeg har prøvet at slette modulet fra config, og det giver ingen forskel." så er det vel ikke der fejlen er ?

Det nemmeste er vel at lokalisere fejlkilden, så man ikke famler i blinde.
Avatar billede kennedk Nybegynder
24. november 2007 - 14:50 #19
Jeg har steget mig blind for længe længe siden
Mine to updatepanels ser sådan her ud:
Menu:

              <asp:UpdatePanel ID="UpdatePanel2" runat="server"  UpdateMode="Conditional">
                <ContentTemplate>       
                    <asp:HiddenField ID="HiddenField1" runat="server" />
                    <table cellpadding="0" cellspacing="0" id="siteMenu" style="height:100%" border="0">
                        <tr>
                        <td style="padding: 0px; height: 10px; background-image: url(Images/treeMenu/1px.gif); background-position:right; background-repeat: repeat-y;"><asp:Label ID="lblMenuButtons" runat="server" /></td>
                            <td id="MenuTD">
                                <asp:HiddenField ID="HiddenFieldToUpdateTreeMenu" runat="server" /> 
                                <asp:Label ID="menuHeadline" CssClass="headline" Text="" runat="server"  />
                                <asp:PlaceHolder ID="PlaceHolderMenu" runat="server"></asp:PlaceHolder>
                                <input type="button" onclick="postBackIndhold('RedigerSide',1)" />
                            </td>
                        </tr>
                    </table>
              </ContentTemplate>
            </asp:UpdatePanel>

Indhold:

                            <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" >
                                <ContentTemplate>
                                    <asp:PlaceHolder ID="PlaceHolderIndhold" runat="server"></asp:PlaceHolder>
                                    <asp:Label ID="lblTest" runat="server" />
                                    <asp:HiddenField ID="HiddenFieldToUpdateIndhold" runat="server" />
                                    <asp:Button ID="btnToUpdate" runat="server" UseSubmitBehavior="false" />
                                </ContentTemplate>
                            </asp:UpdatePanel>

og koden bag for at loade indholdet ser således ud:


public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (HiddenFieldToUpdateIndhold.Value != "")
        {
            string[] HiddenFieldToUpdateIndholdArray = HiddenFieldToUpdateIndhold.Value.Split(';');
            LoadUserControl UserControl = LoadUserControl.FindControlByName(HiddenFieldToUpdateIndholdArray[0]);
            Session["SideID"] = HiddenFieldToUpdateIndholdArray[1];

            Control controlIndhold = Page.LoadControl("~/cms/WebUserControls/" + UserControl.UserControl + ".ascx");
            if (Request.Cookies["postback"] != null)
            {
                if (Request.Cookies["postback"].Value == "false")
                {
                    Session["ControlID"] = "controlIndhold" + Guid.NewGuid();
                }
            }
            if (Session["ControlID"] == null)
            {
                Session["ControlID"] = "controlIndhold" + Guid.NewGuid();
            }
            controlIndhold.ID = Session["ControlID"].ToString();
            PlaceHolderIndhold.Controls.Clear();
            PlaceHolderIndhold.Controls.Add(controlIndhold);
        }

        LoadUserControl MenuUserControl = LoadUserControl.FindMenuControlById(1);
        menuHeadline.Text = MenuUserControl.Navn;

        Control controlMenu = Page.LoadControl("~/cms/MenuWebUserControls/" + MenuUserControl.UserControl + ".ascx");

        controlMenu.ID = MenuUserControl.UserControl;
        PlaceHolderMenu.Controls.Clear();
        PlaceHolderMenu.Controls.Add(controlMenu);

        lblMenuButtons.Text = "<img src=\"Images/selectTreeMenu/bruger_aktiv.gif\">";
    }
}
Avatar billede neoman Novice
24. november 2007 - 15:02 #20
jeg kan ikke debugge det for dig -skal i gang med andet lige nu. Prøv systematisk at fjerne halvdelen af koden og se i hvilken halvdel fejlen er - det er det eneste råd jeg kan give dig.
Avatar billede kennedk Nybegynder
24. november 2007 - 15:21 #21
Jeg takker mange gange så.
Du har fortjent point selvom du ikke har løst problemet.
Avatar billede neoman Novice
24. november 2007 - 15:34 #22
tak for tanken, men eftersom problem ikke er løst så lad bare spørgsmålet stå åbent, og gem points til løsningen - måske kommer der nogen forbi som er rendt ind i noget lignende:)
Avatar billede kennedk Nybegynder
24. november 2007 - 17:46 #23
Nu har jeg lavet en meget simpel version af min hjemmeside, hvor fejlen også er.
Det er 3 filer.
Er der nogen der gider at se på problemet?

http://www.webint.dk/AJAXEnabledWebSite2.zip Filen fylder 5 kb
Avatar billede crazysnap Seniormester
24. november 2007 - 23:05 #24
Hej Kennedk,

I dit test projekt kommer fejlen ved din Session["ID"] variabel i Page_Load på Default.aspx filen:

if (indholdHF.Value != "")
{
      string[] indholdHFArray = indholdHF.Value.Split(';');
      indholdWUCToLoad = indholdHFArray[0];
      Session["ID"] = indholdHFArray[1];  //<--- FEJLER HER

}

Dette er sikkert fordi at en ændring på sessionsvariablen under en partial update invokerer en Response.Write() (?). Når en Response.Write bliver kaldt ved en partial update ændres der på det specielle format som javascriptet på klient siden kan fortolke. Den ender derfor op med en samling af data den ikke kan parse og giver dermed op. Dette resulterer i en Sys.WebForms.PageRequestManagerParserErrorException.

Nu ved jeg jo ikke helt hvorfor du skal gemme det i en sessionsvariabel, men sikkert fordi variablen skal kunne læses i dine UserControls? Eller at du måske i virkeligheden skal gemme et objekt? Hvis sessionsvariablen kun skal bruges på din Default.aspx side, kan du jo gemme indholdet (hvis det er en streng) i en asp:TextBox eller hiddenfield i stedet?

Hvis dette ikke er en mulighed er der jo altid EnableEventValidation="false" løsningen. Denne løsning anser jeg dog som et hack, men det virker. Hvis du tilføjer den attribut i din <%@ Page %> tag, burder fejlen ikke komme mere. Altså:

<%@ Page Language="C#" AutoEventWireup="true" EnableEventValidation="false" CodeFile="Default.aspx.cs" Inherits="_Default" %>


Håber dette hjælper dig videre?  :)


Mvh.
CS
Avatar billede crazysnap Seniormester
24. november 2007 - 23:14 #25
Hov og lige endnu et løsningsforslag,

Siden du ikke må sætte din sessionsvariabel første gang ved en partial postback i din Page_Load kan du jo lave en "sessionvariabel initializer" der sørger for at initialisere de cookies som bruges internt til session-variabler ved en normal postback. Så du kan tilføje:

Session["Initializer"] = "Whatever";

i starten af din Page_Load. Det burde også råde bod på den Exception og er faktisk en bedre og sikrere løsning end EnableEventValidation="false" løsningen.


Mvh.
CS
Avatar billede kennedk Nybegynder
24. november 2007 - 23:32 #26
Hej Nu har jeg putter variablen i en hiddenfield, og det ser skam ud til at virke :)
Super mange gange tak.
Avatar billede crazysnap Seniormester
24. november 2007 - 23:42 #27
Jamen det er jeg da glad for at høre og det var så lidt!  :)

Held og lykke med det...

Mvh.
CS
Avatar billede kennedk Nybegynder
24. november 2007 - 23:51 #28
kan du ikke lige hjælpe med en sidste ting? Nu kommer jeg til at tænkte på det, hvordan kan jeg hente oplysningen i mit usercontrol hvis det er i et hiddenfield?
Du snakkede om at man kunne putte det i et object, men hvordan laves det?

:)
Avatar billede crazysnap Seniormester
25. november 2007 - 00:20 #29
Nej det jeg mente var at hvis du ikke skulle bruge informationen i dine usercontrols og det bare var en streng der skulle gemmes, kunne du bruge en hiddenfield på Default.aspx siden (som du gør nu). Hvis værdien så skal bruges i dine usercontrols er det nok nemmest at gå tilbage til sessions-variabler, som du havde før (du kan dog også sende værdien videre til dine UserControls ved hjælp af accessors (properties), men det er en lidt kringlet løsning).

For at få det til at virke med sessions-variabler skal du i din Page_Load på Default.aspx siden bare assigne en tilfælding Session variable for at initialisere sessions-cookies'ne ved en normal postback (som jeg beskrev tidligere).

Det ville se sådan ud i dit test projekt:


protected void Page_Load(object sender, EventArgs e)
{
    Session["Initializer"] = "Whatever";  //**** INITIALISERER SESSION COOKIES'NE ****

    string menuWUCToLoad = "Default";
    if (menuHF.Value != "")
    {
        menuWUCToLoad = menuHF.Value;
    }

    Control menuControl = Page.LoadControl("~/WUC/menuWUC/" + menuWUCToLoad + ".ascx");
    menuPH.Controls.Clear();
    menuPH.Controls.Add(menuControl);

    string indholdWUCToLoad = "Default";
    if (indholdHF.Value != "")
    {
        string[] indholdHFArray = indholdHF.Value.Split(';');
        indholdWUCToLoad = indholdHFArray[0];
        Session["ID"] = indholdHFArray[1].ToString();
    }
   
    Control indholdControl = Page.LoadControl("~/WUC/indholdWUC/" + indholdWUCToLoad + ".ascx");
    indholdPH.Controls.Clear();
    indholdPH.Controls.Add(indholdControl);
}


Mvh.
CS
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester