Laden...

Postrequest via Javascript funktioniert nicht.

Erstellt von Regenwurm vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.854 Views
R
Regenwurm Themenstarter:in
295 Beiträge seit 2008
vor 12 Jahren
Postrequest via Javascript funktioniert nicht.

Hallo zusammen,

Damit ich in einer Auflistung eine 'In-Place' Edit Funktion ohne Ajax realisieren kann, muss ich via Javascript einen POST (oder einen GET) Request absenden, und diesen mittels ASPX verarbeiten.

Ich habe im Internet nach geeigneten Lösungen für den Javascript Teil gesucht und bin auf folgenden Link gestossen:
http://stackoverflow.com/questions/133925/javascript-post-request-like-a-form-submit

Wenn ich diese Zeilen ausführe, erhalte ich auf meiner ASPX Seite jedoch keine Inhalte im HTTP Header (POST-Variable == null).

Ist der Javascript Teil fehlerhaft, oder muss ich wo anders suchen?

Gruess

ServiceStack & Angular = =)

16.834 Beiträge seit 2008
vor 12 Jahren

Ist schon 3 Jahre her.. da war Cross Side Scripting noch nicht so verbreitet und geschützt. Hast Du hier vielleicht eine andere Domain, als Deine ausführende Seite angegeben? Könnte trotz POST eine Rolle spielen.

Welchen Löungsvorschlag hast Du denn verwendet? Wie sieht die Implementierung Server-seitig aus? Hellsehen können wir schließlich nicht.
Wenn Du keine Form absendest und/oder die Variablen nicht so heißen, wie Du sie erwartest, kommt am Ziel auch niemals etwas gültiges an.

R
Regenwurm Themenstarter:in
295 Beiträge seit 2008
vor 12 Jahren

Hi Abt,

Sorry bin noch nicht ganz wach. 😃
Hier ist meine (momentane) Implementation:
Javascript:

<script type="text/javascript">

    // MODA: Funtkion von Stackoverflow um mittels Javascript einen POST Request zu senden.
    // [URL]http://stackoverflow.com/questions/133925/javascript-post-request-like-a-form-submit[/URL]
    function post_to_url(path, params, method) {
        method = method || "post"; // Set method to post by default, if not specified.
        var form = document.createElement("form");
        form.setAttribute("id", "frmRCH");
        form.setAttribute("name", "frmRCH");
        form.setAttribute("method", method);
        form.setAttribute("action", path);
        for (var key in params) {
            if (params.hasOwnProperty(key)) {
                var hiddenField = document.createElement("input");
                hiddenField.setAttribute("type", "hidden");
                hiddenField.setAttribute("name", key);
                hiddenField.setAttribute("id", key);
                hiddenField.setAttribute("value", params[key]);
                form.appendChild(hiddenField);
            }
        }
        document.body.appendChild(form);
        form.submit();
    }


    function InsertData(CheckID) {
        var Nummer = document.getElementById("TbNummer").value;
        var Rechnungsnummer = document.getElementById("TbRechnungsnummer").value;
        var Bezugsdatum = document.getElementById("TbBezugsdatum").value;
        var Rechnungsdatum = document.getElementById("TbRechnungsdatum").value;
        var Typ = document.getElementById("DDTyp").value;


        post_to_url(document.URL, {                     // Formdaten via POST versenden
                'nummer':           Nummer,             // Railcheck Nummer
                'rechnungsnummer':  Rechnungsnummer,    // Rechnungsnummer
                'bezugsdatum':      Bezugsdatum,        // Datum des Railcheck Bezuges
                'rechnungsdatum':   Rechnungsdatum,     // Datum der Rechnung (bei welcher der Railcheck eingesetzt wurde)
                'typ':              Typ,                // Typ des Railchecks (Codevalue Angabe -> Siehe Codeverwaltung bei WebApps2)
                'checkid' :         CheckID             // ID des Checks (0 -> neu!)
            }, "POST"
        );
    }

</script>

Im Page_Load ist folgender Code Abschnitt zu finden, um die Daten zu verarbeiten:

if (!String.IsNullOrEmpty(Request.Form["checkid"]))
        {
            Int32 RailID = Int32.Parse(Request.Form["checkid"]);
            
            String RailRechnungsnummer = Request.Form["rechnungsnummer"];

            DateTime RailBezugsdatum = new DateTime();
            if (String.IsNullOrEmpty(Request.Form["bezugsdatum"]) || !DateTime.TryParse(Request.Form["bezugsdatum"], out RailBezugsdatum))
            {
                SfFeedback.SqlFailure = "Das Bezugsdatum ist ungültig!";
                Server.Transfer(Request.Url.AbsolutePath);
            }

            DateTime? RailRechnungsdatum = null;
            if (String.IsNullOrEmpty(Request.Form["rechnungsdatum"]))
                RailRechnungsdatum = null;
            else
                RailRechnungsdatum = DateTime.Parse(Request.Form["rechnungsdatum"]);

            string RailTyp = Request.Form["typ"];

            string RailNummer = Request.Form["nummer"];

            Railchecks input = cmpRail.LoadSingleData(RailID);
            if (input == null)
                input = new Railchecks() { ID = 0 };

            input.Nummer = RailNummer;
            input.Rechnungsnummer = RailRechnungsnummer;
            input.Rechnungsdatum = RailRechnungsdatum;
            input.Bezugsdatum = RailBezugsdatum;
            input.Typ_CD = RailTyp;

            if (cmpRail.SaveData(input))
            {
                SfFeedback.SqlSuccess = "Railcheck erfolgreich hinzugefügt / bearbeitet";
            }
            else
            {
                SfFeedback.SqlFailure = "Während des Bearbeitens des Railchecks ist ein Fehler aufgetreten!";
            }

            Server.Transfer(Request.Url.AbsolutePath, false);

        }

Gruess

ServiceStack & Angular = =)

16.834 Beiträge seit 2008
vor 12 Jahren

Hast Du mal mit Firebug geschaut, was wirklich an den Server gesendet wird und im Page_Loag geschaut, was wirklich ankommt? meist sieht man dann genau hier den Fehler.

R
Regenwurm Themenstarter:in
295 Beiträge seit 2008
vor 12 Jahren

Hi,

Die POST Variabeln sind im Page_Load Event alle null.
Ich arbeite hier leider mit Internet Explorer und deswegen ist für mich Firebug keine Hilfestellung.

Wenn ich das Javascript debugge sehe ich folgenden HTML Code in meiner erstellten Form:


<FORM id=frmRCH method=post name=frmRCH action=http://localhost:62456/WebApplication/Oekobonus/Bezueger_Form.aspx?mode=edit&amp;id=10057405><INPUT id=nummer value=adfasdf type=hidden name=nummer><INPUT id=rechnungsnummer type=hidden name=rechnungsnummer><INPUT id=bezugsdatum value=26.03.2012 type=hidden name=bezugsdatum><INPUT id=rechnungsdatum type=hidden name=rechnungsdatum><INPUT id=typ value=1 type=hidden name=typ><INPUT id=checkid value=0 type=hidden name=checkid></FORM>

Also das erstellen des Formulars sollte meiner Meinung nach ok sein.

Gruess

ServiceStack & Angular = =)

16.834 Beiträge seit 2008
vor 12 Jahren

Also das erstellen des Formulars sollte meiner Meinung nach ok sein.

Das sieht der HTML Standard anders.

<INPUT id=bezugsdatum value=26.03.2012 

Ist kein gültiges HTML. Es fehlen die Anführungszeichen, die vor bei Werten mit Leerzeichen zwingend erfordernlich sind. Bei allen anderen sind die Browser so intelligent, und erkennen es selbst, auch wenn es eigentlich nicht gültig ist.

<INPUT id="bezugsdatum" value="26.03.2012" 

Ich arbeite hier leider mit Internet Explorer und deswegen ist für mich Firebug keine Hilfestellung.

Dann installiert man sich Firefox - oder Chrome bzw. Chromeplus. Der IE ist der mit Abstand schlechteste Browser für die Entwicklung von Webseiten, weil es einfach keine Debugging-Möglichkeiten gibt.

Die musst Du Dir aber selbst schaffen; die kann und wird Dir niemand abnehmen.

M
334 Beiträge seit 2007
vor 12 Jahren

Dann installiert man sich Firefox - oder Chrome bzw. Chromeplus. Der IE ist der mit Abstand schlechteste Browser für die Entwicklung von Webseiten, weil es einfach keine Debugging-Möglichkeiten gibt.

Der IE hat glaub ich seit Version 8 einen Entwicklermodus, mit dem kann man einigermaßen Webseiten debuggen. Ist zwar nicht perfekt, aber besser als gar nichts.
Aufrufen kann man den Entwicklermodus mit der Taste F12.

Des Weiteren kann man JavaScript im IE mit VS debuggen

R
Regenwurm Themenstarter:in
295 Beiträge seit 2008
vor 12 Jahren

Hi Abt,

Dass der IE sicher nicht der optimale Browser ist bin ich mir bewusst.
Leider habe ich hier Vorgaben welche ich nicht einfach umgehen kann.

Es scheint so als ob die Übergabe der POST Variabeln nur im Debug Modus funktioniert (keine Ahnung warum).

Ausserdem wird nach erfolgreicher Verarbeitung 'einfach so' der Eventhandler meiner 'Löschen' Spalte aufgerufen & das neu erstellte Item dadurch wieder aus der Datenbank entfernt.

Einen Fehler habe ich bei einem kurzen Überblick leider nicht gefunden.
Aufgrund dessen dass es sich hier um eine Abschlussarbeit handelt und ich einen begrenzten Zeitplan habe, muss ich die Massnahme ergreiffen und eine separate Seite für die Bearbeitung der einzelnen Spalten erstellen.
Mir fehlt einfach die Zeit um mich hier weiter mit dem Problem zu beschäftigen.

Aber ich bleibe dran um dies für mögliche - zukünftige - Projekt zu realisieren.

Merci nochmal für die Tipps,

Gruess

ServiceStack & Angular = =)

16.834 Beiträge seit 2008
vor 12 Jahren

Naja alsowenigstens zur Entwicklung kann man immer einen FF nutzen; zur not den Portable. Das werden Dich auch Deine Prüfer fragen; schließlich musst Du ja auch Probleme und Lösungswege beschreiben wenn ich mich richtig entsinne. Ist ja ein künstliches Hindernis.

Mehr kann ich in Sachen WebForms leider auch nicht helfen. Bin in der für mich deutlich angenehmeren MVC-Welt zu Hause.

Trotzdem viel Glück weiterhin.

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

Du fügst ja eine eigene Form zum Dokument per Script hizu - normalerweise ist bei WebForms nur ein einziges Formular erlaubt, das dann auch für Postback benutzt wird. Möglicherweise lliegt da der Fehler, weil Request.Form dieses Standardformular abbildet, Du aber ein eigenes benutzt...
Versuch mal statt Request.Form["paramName"] direkt über Request["paramName"] zuzugreifen, dann müsstest Du - so sie denn richtig versendet werden - Deine Werte erhalten.

Gruss, MarsStein

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