21. januar 2006 - 22:32Der er
13 kommentarer og 1 løsning
Postback, custom servercontrol og loadpage
Ok, lidt rodet overskrift, men problemet er som følger: Jeg har en servercontrol, som bl.a. indeholder en login-form. Login-formen raiser en event når der klikkes på login. Desuden lister serverkontrollen en række værdier, som tilføjes ved load_page. Det virker glimrende, bortset fra når man klikker på login, så er det som om serverkontrollen bliver renset for de værdier der var lagt ind i den ved load_page - hvad sker der?
ikke lige til at svare på ud fra det du siger synes jeg.... er det asp.net 2.0 du arbejder med, og hvordan har du bygget din serverkontrol? og... hvordan kan det være at du selv har lavet en serverkontrol der huser en login-kontrol + andet? mvh
hmm...har så lavet den en del om... men har følgende kode, hvor jeg har problemet med at smide noget ind i værdien ErrorMessage i forbindelse med event:
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Collections;
namespace JegStener.Framework.Controls { public class LogForm : Control, INamingContainer { //Private strings til username og password private string _UserName; private string _UserPass; private bool _Persistent; private string _ErrorMessage;
//Eventhandler public event EventHandler Login;
//Properties username og password public string UserName { get { return _UserName; } } public bool Persistent { get { return _Persistent; } } public string UserPassword { get { return _UserPass; } } public string ErrorMessage { set { _ErrorMessage = value; } get { return _ErrorMessage; } }
//Funktion til at håndtere og raise events protected void OnChange(EventArgs e) { //Raise login-event Login(this, e); }
//Generer underkontroller protected override void CreateChildControls() { //Add HTML og tekst this.Controls.Add(new LiteralControl("<div class=InfobarHeadline>Login</div>")); this.Controls.Add(new LiteralControl("<div class=InfobarItem>")); this.Controls.Add(new LiteralControl("Brugernavn: "));
//Brugernavn-textboks TextBox BrugernavnBox = new TextBox(); //Tilføj Onchange-event BrugernavnBox.TextChanged += new EventHandler(this.BrugernavnBox_Change); this.Controls.Add(BrugernavnBox);
//Password tekst og textboks this.Controls.Add(new LiteralControl("Password: ")); TextBox PasswordBox = new TextBox(); PasswordBox.Text = _UserPass; //Tilføj Onchange-event PasswordBox.TextChanged += new EventHandler(this.PasswordBox_Change); this.Controls.Add(PasswordBox);
det er nok ikke fordi du ikke kan få sat variablen - men createchildcontrol kører før din eventhandler - så opbygger kontrollen udfra den errormessage der er før du kører din handler. mvh
hvis du istedet gjorde sådan her: (bare et eksempel)
// klassevariabel private LiteralControl literal;
// i cratechildcontrol if(_errorMessage != null) { literal = new LiteralControl; Controls.Add(literal); }
// og i din handler literal.Text = "...";
så ville det medfører at din literal bare blev renderet sammen med resten, hvilket sker efter din handler er eksekveret, hvilket så igen ville medføre at det er den tekst du har sat i din handler du får vist.
men... du kan også gøre det, at du sørger for at den slags helt generelt først angives ved renderingen.
protected override void Render(HtmlTextWriter writer) { // her sørger du så for at angive hvordan kontrollen tingene skal foregå base.Render(writer); }
nu er der forskellige måder at gøre tingene på.... den kontrol du har lavet betegnes typisk som en composite control (altså en kontrol der blot sætter andre kontroller ind). en anden type - den man kalder rendered controls - producerer typisk output ved at overskrive rendermetoden. den sidste type er vanligvis den med bedst performance, men den første giver et rart "hands-on" med kontrolhierarkiet.
jeg synes du skal gøre som du har gjort nu, men modificere det så det virker som det første eksempel du fik, eller indsætte den specifikke kontrol i forbindelse med renderingen - hvis der står noget i errormessage - sådan her:
du kan benytte Controls.AddAt(int index, control control), men du kan også i din createchildcontrols sætte en placeholder ell. ind - så du kan proppe kontrollen derind istedet (hvis det bliver nødvendig).
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.