20. oktober 2007 - 13:24Der er
41 kommentarer og 1 løsning
undgå postback for at opdatere updatepanel
Hej eksperter. Jeg sidder og har en side med et updatepanel i, som sidens indhold skal være på. Og sidens indhold er i UserControls, som bruger lagt ind i mit updatepanel med et multiview. sådan her:
Som i kan se er der også et hiddenfield, som jeg burger til at opdatere mit updatepanel med, og den værdi det hidden field har finder ud af hvilket usercontrol der skal vises.
jeg opdatere updatepanelet med javascript sådan her:
function postBackIndhold(side,id) { var hiddenField = $get("<%=HiddenFieldToUpdateIndhold.ClientID %>"); if (hiddenField) { hiddenField.value = side + ";" + id; __doPostBack("<%=HiddenFieldToUpdateIndhold.ClientID %>",''); } }
men der giver mig et problem, når jeg vil bruge en textbox inde på sidens indhold, altså i et userControl. jeg kan jo ikke tjekke om det er IsPostBack, for det er det jo hele tiden da jeg opdatere det ved postback.
så denne kode :
public partial class WebUserControls_RedigerSide : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { propSide propSide = facSide.GetSide(Convert.ToInt32(Session["SideID"])); if (propSide != null) { txtHeadline.Text = propSide.Navn; txtText.Text = propSide.Tekst; }
Måske kan du lave en public function som kan returnerer textbox værdien for dig Kombineret med en som du kan kalde for at hente tekst værdier fra databasen.
Og i den sidste artikel er der et andet fif i indlæggene: "Hi. I was waving some trouble precisely with initialisation of web user controls. I then was told you can use Page_Init , and it works. code in Page_Init fires only once at initialisation for controls, so it's the equivalent of doing Page_Load and then checking for IsPostBack == true"
altså nu har jeg prøvet at bruge Page_Init i stedet for Page_Load og det virker ikke, så udskrives dataen den første gang, og så udskrives den ikke mere. og det må så være fordi den kun læser koden een gang.
Og det andet kode der var vist, det forstod jeg ikke hvordan det skulle sættes ind.
Yeah - men jag kan ikke udfra se om den bliver loaded to gange. I den venstre yderkant af kodevinduet - den grå vertikale bjælke i koden på din user control - klik med musen - der vil komme en rød klat som er et break point. Når du nu trykker på Kør (den grønne pil), så vil koden stoppe der. Tryk på den grønne pil igen, og fortæl om koden stopper en gang til eller ej:)
For at blive af med klatten senere tryk blot på den igen.
Nej, du har fået koden fra mit userkrontrol :) kan det være noget med den if sætning der tjekker om viewstaten er null ? ved ikke hvordan man skal tjekke om viewstate et sat.
Det er den måde man chekcer det på vist - i vb skal man skrive (skrev fejl før)
IsNothing (ViewState("blabla")) men tror du godt kan checke på null i C# sådan som du gør.
Men sagen er at den kommer ind i den If block, fordi reloaded=true, og det er den eneste måde det kunne sættes på - derfor fatter jeg intet, og mistænkte at kontrollen blev også loaded flere end een gang.
I øvrigt, hele idéen duer ikke i den nuværende form, fordi du genbruger kontrollen på en del sider, mensom faktisk alle er den samme aspx side. Og det vil sige når ViewState for kontrollen een gang er sat, så bliver den ved med at være sådan,når du kalder kontrollen et andet sted fra (fordi det er samme page). MEn dat kan man sikkert fikse.
Hvsi du kommenterer if (ViewState["mitKontrolnavn"] != null) { reloaded = Convert.ToBoolean(ViewState["mitKontrolnavn"]); } ud så burde den komme med NOTCallback:)
derpå, if (ViewState["mitKontrolnavn"] != null) { reloaded = false; }
så ser vi havd der sker:=
og derpå:
if (ViewState["mitKontrolnavn"] != null) { reloaded = (Boolean)(ViewState["mitKontrolnavn"]); }
nej det kan du ikke postback mekanikken er jo en del af systemet som du ikke bare kan smide ud. Det eneste du kan gøre er at holde styr på hvad du laver.
En anden metode må være at du selv styrer det derfra hvor du loader kontrollen. Lav en public property på kontrollen som har samme funktion som reload variablen nu, og så kan du sætte den til false i den kode som loader kontrollen og til false de efterfølgende gange
Tjoh - problemet er ikke løst så jeg vil hellere nøjes med dit tak for nu. Dr_chaos er helt sikkert i stand til svare for sig selv:)
Men, fatter stadig ikke at det ikke funker (selv om selv hvis det virkede, så måtte vi nok modificere det en del da du har alt kørende i en aspx side)..
God nat - man får masser af gode ideer mens man sover.)
Når jeg trykker på menu punktet laver jeg en cookie: function postBackIndhold(side,id) { var hiddenField = $get("<%=HiddenFieldToUpdateIndhold.ClientID %>"); if (hiddenField) { if(document.cookie = "postback=false; path=/;"){ hiddenField.value = side + ";" + id; __doPostBack("<%=HiddenFieldToUpdateIndhold.ClientID %>",''); } } }
så når jeg kører usercontrollen tjekker jeg om cookien er lavet, og hvis den er det, er det ikke postback, og så sletter jeg den..
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.