Nach Portierung von ASP.NET 2 auf 4.0: CalendarPicker gibt das Datum nicht mehr an den Aufrufer zurück



  • Und nochmal....
    Wieder ein riesen Problem mit .NET 4.0. Das Zeug bringt mich zur Verzweiflung!
    Unter .NET 2.0 hat alles noch funktioniert.

    Der CalendarPicker wird als PopUp aufgerufen.
    Die Rückgabe an den Aufrufer erfolgt über ein Javascript.
    Es wird auch ein window.close() dabei aufgerufen, das ebenfalls nicht ausgeführt wird.

    Zunächst der Aufruf des CalendarPickers: (Das funktioniert noch!)

    <a href="javascript:;" onclick="calendarPicker('aspnetForm.ctl00$ContentPlaceHolder1$Tx_DateFrom');" title="Pick Date from Calendar">Tag wählen</a></td>
    

    "calendarPicker(..)" sieht so aus: (Ist in der page.master enthalten)

            function calendarPicker(strField)
            {
                var ans; 
                ans = window.open('pickDate.aspx?field=' + strField, 'calendarPopup', 'width=219,height=200,resizable=no,status=no');
                return ans;
            }
    

    Nun die "pickDate.aspx":

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Tag wählen</title>
    </head>
    <body onblur="this.window.focus();">
        <form id="Form1" runat="server">
        <div style="text-align: center">
            <asp:Calendar ID="Calendar1" runat="server" BackColor="White" BorderColor="#999999"
                CellPadding="4" DayNameFormat="Shortest" Font-Names="Verdana" Font-Size="8pt"
                ForeColor="Black" Height="180px" Width="200px" OnDayRender="Calendar1_DayRender">
                <SelectedDayStyle BackColor="#666666" Font-Bold="True" ForeColor="White" />
                <TodayDayStyle BackColor="#CCCCCC" ForeColor="Black" />
                <SelectorStyle BackColor="#CCCCCC" />
                <WeekendDayStyle BackColor="#FFFFCC" />
                <OtherMonthDayStyle ForeColor="#808080" />
                <NextPrevStyle VerticalAlign="Bottom" />
                <DayHeaderStyle BackColor="#CCCCCC" Font-Bold="True" Font-Size="7pt" />
                <TitleStyle BackColor="#999999" BorderColor="Black" Font-Bold="True" />
            </asp:Calendar>
        </div>
        </form>
    </body>
    </html>
    

    Und das zugehörige C#:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    
    using System.Diagnostics;
    
    public partial class pickDate : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            
        }
        protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
        {
            // Clear the link from this day
            e.Cell.Controls.Clear();
    
            // Add the custom link
            System.Web.UI.HtmlControls.HtmlGenericControl Link = new System.Web.UI.HtmlControls.HtmlGenericControl();
            Link.TagName = "a";
            Link.InnerText = e.Day.DayNumberText;
            Link.Attributes.Add("href", String.Format("JavaScript:window.opener.document.{0}.value=\'{1:d}\'; window.close();", Request.QueryString["field"], e.Day.Date));
        //    Link.Attributes.Add("href", String.Format("JavaScript:window.opener.identifyMe(window).value=\'{1:d}\'; window.close();", Request.QueryString["field"], e.Day.Date));
    
            // By default, this will highlight today's date.
            if (e.Day.IsSelected)
            {
                Link.Attributes.Add("style", this.Calendar1.SelectedDayStyle.ToString());
            }
            
            // Now add our custom link to the page
            e.Cell.Controls.Add(Link);
        }
    }
    

    Und als Bild der Rücksprung-Link:
    ... Mist, kann keine Bilder einfügen....

    javascript:window.opener.document.aspnetForm.ctl00$ContentPlaceHolder1$Tx_TrgsTableDateForm.value='10.03.2019'; window.close();
    

    Also auch das "window.close()" wird nicht ausgeführt!
    Kann mir hier vielleicht bitte jemand helfen?
    Vielen Dank
    Helmut





  • @Swordfish
    Wenn du lesen würdest, würdest du merken, dass es drei verschiedene Probleme sind



  • Durch Tagelage Tests weiss ich inzwischen, dass das Problem JavaScript ist.
    Hier hat Microsoft ganze Verwirrungsarbeit geleiste.
    Ich kann mir nicht vorstellen, dass man es schlimmer machen kann!

    Mein JavaScript ist in der "Page.Master".
    Früher konnte man auf ein Feld mit dem Namen "aspnetForm.ctl00ContentPlaceHolder1ContentPlaceHolder1Tx_DateFrom" zugreifen.
    in der aspx-Seite heisst das dann einfach nur "Tx_DateFrom".

    Unter .NET 2.0 ging das!
    Nun hat sich irgend ein Schceiss geändert.
    Auf keiner Website oder Forum ist rauszubekommen, wie man das nun machen muss.
    Wahrscheinlich wissen es die Entwickler von Microsoft nicht mal selbst!

    Hier noch mein Script, mit dem ich getestet habe:

            function ProcessChildMessage(message) {
    
                var pos = message.lastIndexOf("$");
                if (pos >= 0) {
                    var fieldvalue = message.substr(pos + 1);
                    var pos2 = fieldvalue.lastIndexOf("=");
                    if (pos2 > 0) {
                        var myfield = fieldvalue.substr(0, pos2);
                        var myvalue = fieldvalue.substr(pos2 + 1);
                        document.getElementBydName("aspnetForm.ctl00$ContentPlaceHolder1$Tx_DateFrom").value = myvalue;
                        alert(myfield + "=" + myvalue);
                    } else {
                        alert(fieldvalue);
                    }
                } else {
                    alert(message);
                }
                return true;
            }
    
    

    Der Fehler ist in dem "document.getElementBydName(..)"
    Ich habe alle Möglichkeiten durchprobiert.
    Es ist nicht möglich, dem input Feld einen Wert zuzuweisen!!

    Es kann doch nicht sein, dass es niemand gibt der das Problem noch nicht hatte.
    Das muss doch millionenfach schon vorgekommen sein???

    Bitte helft mir!

    Danke
    Grüsse
    Helmut



  • document.getElementBydName liefert nicht nur ein Element zurück, sondern alle Elemente, die den entsprechenden Namen haben, da der Name eines HTML Elements im Gegensatz zur id nicht eindeutig sein muss.

    Benutze stattdessen document.getElementById . Das liefert dir genau ein Element (oder auch keins, wenn es kein Element mit der entsprechenden ID gibt).



  • @Burkhi
    Danke Burkhi,

    Gerade sehe ich auch, dass das input Element mit einer ID definiert wurde.

    <asp:TextBox ID="Tx_DateFrom" runat="server" Width="76px"></asp:TextBox>
    

    Und es ist ein server gebundenes Feld.
    Das Javascript befindet sich in der "page.master".

    Im Übrigen stürzt das Javascript mit dieser Anweisung ab, da im Anschluss auch keinen "alert" mehr gibt,
    Alle meine ausprobierten Varianten, die mir eingefallen sind.

    Ich habe dann auch in meinem Script zum einen den Schreibfehler erkannt (getElementBydName) und ihn korrigiert (getElementByName).
    Dann habe ich auch die Version mit der Id ausprobiert (getElementById).
    Neben dem hier eingesetzten langen Namen habe ich auch die kurze Version versucht ("Tx_DateFrom").

    Ich habe die Website nicht selbst geschrieben. Aber der Entwickler hatte damals den oben angegebenen Namen
    verwendet

    ("aspnetForm.ctl00$ContentPlaceHolder1$Tx_DateFrom"). 
    

    Den hat er fix in den Link geschrieben, mit dem der DatePicker aufgerufen wird.
    Dadurch hat man dann die Referenz auf dieses input Feld, um es anschliessend mit dem gewünschten Datum zu füllen. Damit lief es auch jahrelang unter .net 2.0.

    Es muss also einen Grund gegeben haben, diesen Name zu verwenden.

    Irgendwie muss sich da aber etwas bei Microsoft verändert haben, sonst würde auch die alte Methode noch funktionieren.

    Im Übrigen sind alle Beispiele, die ich im Netz auf renomierten Websides wie CodeProject, microsoft tutorials, etc. gefunden habe, falsch.
    Die Website lässt sich damit nicht mal mehr erstellen.

    Ich habe übrigens auch versucht, den pages-Eintag in der web.config anzupassen.
    Auch ohne Erfolg.
    Zwei Varianten:

    <pages controlRenderingCompatibilityVersion="3.5">
    <pages clientIDMode="AutoID|Predictable|Static|Inherit">
    

  • Administrator

    Ich habe keine Ahnung von ASP.net, aber zwei allgemeine Dinge.

    @elmut19 sagte in Nach Portierung von ASP.NET 2 auf 4.0: CalendarPicker gibt das Datum nicht mehr an den Aufrufer zurück:

    Es muss also einen Grund gegeben haben, diesen Name zu verwenden.

    Schliesse nie Unwissen aus. Kann auch gut sein, dass der Entwickler es nicht besser gewusst hatte.

    Im Übrigen sind alle Beispiele, die ich im Netz auf renomierten Websides wie CodeProject, microsoft tutorials, etc. gefunden habe, falsch.

    Wenn alle falsch fahren, fährst vielleicht tatsächlich du falsch? 😉



  • @Dravere
    Klar!
    Bei mir ist es Unwissen.
    Ich sehe nur, dass alles, was ich im Netz dazu lese (sehr wenige Quellen), nicht funktioniert.
    Wahrscheinlich auch, weil ich es nicht verstehe und dadurch falsch einsetze.

    Deshalb hoffe ich, dass hier irgend jemand ist, der mir hilft, es zu verstehen.



  • Nach tagelangem Suchen, und auch mit Burkhis Hinweis, habe ich es nun doch hinbekommen.
    Folgende Anpassungen.
    In der" web.config":

        <pages clientIDMode="Static">
    

    Ich habe den clientIDModeergänzt. am Textfeld habe ich nichts geändert.

    In der "page.master" habe ich die neue Function wie folgt ausgelegt:

            function ProcessChildMessage(message) {
    
                var pos = message.lastIndexOf("$");
                if (pos >= 0) {
                    var fieldvalue = message.substr(pos + 1);
                    var pos2 = fieldvalue.lastIndexOf("=");
                    if (pos2 > 0) {
                        var myfield = fieldvalue.substr(0, pos2);
                        var myvalue = fieldvalue.substr(pos2 + 1);
                        document.getElementById(myfield).value = myvalue;
                    } else {
                        alert(fieldvalue);
                    }
                } else {
                    alert(message);
                }
                return true;
            }
    

    Die alte Methode, die Werte zu übergeben habe ich fallen lassen.

    Danke nochmals für eure Antworten.
    Grüsse
    Helmut


Anmelden zum Antworten