16. september 2005 - 08:44Der er
26 kommentarer og 1 løsning
Refresh-problem i UserControl
Hej.
Jeg har en aspx-side med en UserControl på. I min UserControl er der en liste hvorfra jeg kan vælge en værdi. Udfra den værdi bliver der skabt en Cookie, som i samme øjeblik skal bruges i scriptet på selve min aspx-side.
Problemet er, at det virker fint, men at min aspx-side hele tiden er en cookie (fra min liste) bagud. Når jeg klikker i min liste skabes cookie'en, men min aspx-side bruger den cookie som var valgt sidst - altså der mangler en slags 'refresh' i det script i min UserControl, som opretter cookie'en udfra min valgte værdi.
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
du må spørge hvis der er noget du er i tvivl om, men som udgangspunkt kører din page_load altid før din eventhandlers, så at have kode i page_load der er afhængig af det der sker i en eventhandler er noget skidt. enten vil du være forsinket et roundtrip - eller også vil du komme til at køre de samme ting flere gange.
Jeg er næsten med :-) Jeg har denne kode i min UserControl der ændrer cookien:
Public Sub ChangeLan(ByVal sender As Object, ByVal e As System.EventArgs)
Dim LanCookie As New HttpCookie("FlLanguage") LanCookie.Value = DrpLanguage.SelectedItem.Value LanCookie.Expires = dt.Add(ts) Response.Cookies.Add(LanCookie)
End Sub
Hvordan hæver jeg det event med:
someUserControl.CookieChanged += new EventHandler(someUserControl_CookieChanged);
Hvad er somUserControl mere præcist i mit tilfælde?
someUserCotrol er bare den du har, og får at få hævet kan du bruge følgende model:
// definér et event på din klasse: public event EventHandler CookieChanged;
// implementer en metode der kan hæve det protected virtual void OnCookieChanged(EventArgs e) { if(CookieChanged!=null) CookieChanged(this, e); }
// og - i den metode du har vist kan du så bare OnCookieChanged(EventArgs.Empty);
så kan du hooke op på det event fra din form som vist med: someUserControl.CookieChanged += new EventHandler(someUserControl_CookieChanged);
ovenstående er den anbefalede model, og den kan du fører videre, hvis du f.eks. ønsker at benytte et specielt argument ol. f.eks. kan du lave et argument som du kan trykke de oplysninger på, som du på nuværende tidspunkt lægger i cookien - så kan du jo muligvis droppe den (cookien).
Protected Overridable Sub OnCookieChanged(ByVal e As EventArgs) If Not (CookieChanged Is Nothing) Then CookieChanged(Me, e) End If End Sub
Public Sub ChangeLan(ByVal sender As Object, ByVal e As System.EventArgs)
Dim LanCookie As New HttpCookie("FlLanguage") LanCookie.Value = DrpLanguage.SelectedItem.Value LanCookie.Expires = dt.Add(ts) Response.Cookies.Add(LanCookie) OnCookieChanged(EventArgs.Empty) End Sub
I min aspx-side, skal jeg så have
someUserControl.CookieChanged += new EventHandler(someUserControl_CookieChanged)
ind i min page_load() og er someUserControl = det jeg har stående i TagName'et for min UserControl?
Sorry hvis jeg er helt væk, men er ikke helt familiær med begreberne endnu (metode, hooke up, event og argument) :-)
someUserControl skal være dit id på den usercontrol du har på din side. hvis det giver dig en compilerfejl, skal du deklerere den withevents i din klasse. (jeg er ikke helt klar over hvordan miljøet opfører sig når man arbejder med vb). ... måske har du allerede din kontrol i rullegardinerne når du er i din codebehind, og du kan se der vælge eventet.
Hej igen, ja den kunne ikke genkende min UserControl, så jeg har nu deklareret den i min klasse, sådan at koden i min klasse ser således ud:
Public Language As Control = Page.LoadControl("/myControls/language.ascx") Public Event CookieChanged As EventHandler
Public Sub Language_CookieChanged(ByVal sender As Object, ByVal e As EventArgs) GetLanguage() End Sub
I min UserControl Language.aspx bliver cookien dannet, og jeg opretter (forhåbentligt) et event med:
Public Sub ChangeLan(ByVal sender As Object, ByVal e As System.EventArgs) Dim LanCookie As New HttpCookie("FlLanguage") LanCookie.Value = DrpLanguage.SelectedItem.Value LanCookie.Expires = dt.Add(ts) Response.Cookies.Add(LanCookie) AddHandler Language.CookieChanged, AddressOf Language_CookieChanged End Sub
- Som starter Sub Language CookieChanged() oppe i min klasse.
OG i min aspx har jeg:
Sub Page_Load(ByVal Source As Object, ByVal E As EventArgs) If Not IsPostBack Then GetLanguage() End If End Sub
Sub GetLanguage()
'*** Hvad der nu skal ske afhængigt af min cookie
End Sub
- Men, jeg får nu fejlen "Name 'GetLanguage' is not declared." i min aspx. Hvorfor bliver GetLanguage i min aspx ikke kørt her?
Jeg smider lige nogle flere points for besværet :-)
hey hov - lige et øjeblik.... der er noget der er galt:
hvis det her er i din usercontrol:
Public Sub ChangeLan(ByVal sender As Object, ByVal e As System.EventArgs) Dim LanCookie As New HttpCookie("FlLanguage") LanCookie.Value = DrpLanguage.SelectedItem.Value LanCookie.Expires = dt.Add(ts) Response.Cookies.Add(LanCookie) End Sub
skal du sørge for at hæve eventet derfra, så denne: AddHandler Language.CookieChanged, AddressOf Language_CookieChanged
skal udskiftes med denne: OnCookieChanged(EventArgs.Empty);
i din code-behind til din form, skal du så AddHandler Language.CookieChanged, AddressOf Language_CookieChanged
og have metoden Language_CookieChanged implementeret, hvor du så uden problemer skulle kunne kalde GetLanguage()
Sorry - tror jeg misforstod noget af det du skrev tidligere... Gik nok lidt for stærkt.
I orden, jeg er også ved at være en bug med det her spørgsmål, men det er lige en afgørende detalje for at jeg kan komme videre med mit projekt.
Men de data/den tekst jeg henter, smider jeg ud i nogle labels. Som du nok har regnet ud, så leger jeg med at site hvor brugeren vælger et sprog i UserControl'en, skaber en cookie, og alt tekst-indholdet på Aspx-siden bestemmes så udfra cookiens værdi.
Hej igen, jeg ved ikke men jeg tror at det eneste jeg har som problem nu, er at få min aspx's klasse "Webform.vb" til at snakke sammen med min UserControl's klasse "UserControl.vb"
Nu bliver min UserControl "language.ascx" nemlig fundet nede i min aspx, hvor den har ID=UserLan.
Så kommer meddelelsen:
" The base class includes the field 'UserLan', but its type (FormClass) is not compatible with the type of control (ASP.language_ascx). "
Mine to klasser har disse navne:
Webform.vb: Public class Formclass : Inherits Page Public UserLan As Formclass = Page.LoadControl("/Ascx/language.ascx") ' anden kode End Class
UserControl.vb: Public UserClass Class : Inherits UserControl ' anden kode End Class
Jeg har prøvet at ændre declarationen af min UserControl, i WebForm.vb til:
Public class Formclass : Inherits Page Public UserLan As UserClass = Page.LoadControl("/Ascx/language.ascx") ' anden kode End Class
Men her kommer der så en fejl med at UserClass ikke er defined.
Hej, det blev noget rod, så jeg må se at komme videre med projektet :-)
Jeg tror jeg løser problemet ved at lave en refresh af siden når cookien er dannet. -På den måde slipper jeg omkring forsinkelsen, da jeg ikke kan få hooket up på eventet i samme round trip som det dannes i UserControl'en.
Men du skal have mange tak for din hjælp, som helt sikkert er points værdig, så smid endelig et svar :-)
Ok - helt i orden, jeg takker for hjælpen denne gang! :-)
Synes godt om
Ny brugerNybegynder
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.