Laden...

ContentPlaceHolder + Timer

Erstellt von progi123 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.418 Views
progi123 Themenstarter:in
71 Beiträge seit 2008
vor 13 Jahren
ContentPlaceHolder + Timer

Hi,

ein Timer tickt jede Sekunde und holt sich aktuelle Daten aus der Datenbank. Auf einer üblichen aspx Seite funktioniert es wunderbar. Sobald man das Ganze in einen ContentPlaceHolder plaziert, wird das Tick-Ereignis nicht mehr ausgelöst. Weiß jemand einen Rat?

<%@ Page Language="C#" MasterPageFile="~/User/UserMaster.master" AutoEventWireup="true"
    CodeFile="Karte.aspx.cs" Inherits="User_content_Karte" Title="Map" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="Timer1_Tick">
            </asp:Timer>
            <asp:HiddenField ID="SomeData" runat="server" />
        </ContentTemplate>
    </asp:UpdatePanel>
    
    <iframe src="/Map.htm" frameborder="no" height="80%" scrolling="no" width="100%" />
</asp:Content>

protected void Timer1_Tick(object sender, EventArgs e)
    {
        SomeData.Value = DbData.GetSomeData();
        Page.Title = "yeha es geht"; //geht eben nicht   
    }
2.298 Beiträge seit 2010
vor 13 Jahren

Kannst du den Timer nicht außerhalb des ContentTemplate ablegen und die Daten dennoch im ContentTemplate ausgeben?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

der Timer tickt vermutlich schon, aber da er im UpdatePanel liegt, kannst Du nur im UpdatePanel aktualisieren. Da ist aber der Seitentitel nicht drin. Und da alles über Javascript läuft, siehst Du im Quelltext der Seite auch nicht, daß Dein HiddenField besetzt wird. Wenn man ins DOM schaut, müsste man es hingegen sehen.

Zwei Testvorschläge:

  1. Mach mal ein Label ins UpdatePanel und schreib im Tick-Event einen Text rein, dann wird es funzen.
  2. Platziere den Timer ausserhalb des UpdatePanel, dann geht das auch mit dem Titel.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

progi123 Themenstarter:in
71 Beiträge seit 2008
vor 13 Jahren

Hi,

der Versuch mit der TextBox hat funktioniert, allerdings geht es nur, wenn man die Zeile mit dem iframe entfernt. Nun läuft in der Map.htm ein JavaScript-Steuerelement mit einem Timer. Da sollte auf die aktuelle Position zugegriffen werden. Die Sessionvariable gibt den richtigen Wert in der TextBox aus. Leider kann ich aber nicht aus der Map.htm darauf zugreifen. position="<%=Account.Position%>"; hat einen leeren Wert. Wie könnte ich an die Daten rankommen?

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <contenttemplate>
        
<asp:Timer id="Timer1" runat="server" OnTick="Timer1_Tick" Interval="1000"></asp:Timer>
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>

</contenttemplate>
    </asp:UpdatePanel>
    
    <% Response.WriteFile("/LogIn/Map/Map.htm"); %>
</asp:Content>

protected void Timer1_Tick(object sender, EventArgs e)
    {
        Account.Position = DbData.GetPosition(); //Sessionvariable setzen
        TextBox1.Text = Account.Position; //funktioniert
    }

//Account.cs
public static string Position
    {
        get
        {
            bool keyFound = false;
            for (int i = 0; i < HttpContext.Current.Session.Keys.Count; i++)
            {
                if (HttpContext.Current.Session.Keys[i].Equals("Position"))
                {
                    keyFound = true;
                    break;
                }
            }

            if (keyFound)
                return (string)HttpContext.Current.Session["Position"];
            return "0.0";
        }
        set { HttpContext.Current.Session["Position"] = value; }
    }

//Map.htm
<html>
    <head>
        <script type="text/javascript">
            var position = 0.0;
            function init() 
            {
                window.setInterval("doSomething()", 1000);
            }

            function doSomething()
            {
                position="<%=Account.Position%>";
            }
            
        </script>
    </head>
    <body onload="init();">
        <div style="width:100%; height:100%" id="map"></div>
       
    </body>
    </html>

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

<% Response.WriteFile("/LogIn/Map/Map.htm"); %>

innerhalb des Content ist eine ganz schlechte Idee -> das schreibt das ganze Map.htm in die Response.

Du brauchst es aber auch gar nicht, die Geschichte mit dem Iframe funktioniert sobald dieser ein Endtag bekommt. Also

<iframe src="/Map.htm" frameborder="no" height="80%" scrolling="no" width="100%"></iframe>

statt

<iframe src="/Map.htm" frameborder="no" height="80%" scrolling="no" width="100%" />

udem müsste die Map.htm wohl eine Map.aspx werden, damit da drin serverseitig überhaupt was funktioniert.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca