2016-07-09 8 views
2

Ich bin in der Lage, es funktionieren zu lassen (Erfolgsrückruf).AJAX-Aufruf, der kein JSON-Objekt von WebMethod zurückgibt

Aber was ich als Antwort erhalten, ist die ganze HTML von default.aspx

The AJAX:

function CreateLottery(lottery) { 
debugger; // 'lottery' comes with the properties of the Lottery class 
$.ajax({ 
    type: 'POST', 
    url: 'default.aspx/Create', 
    data: JSON.stringify({ data: lottery }), 
    dataType: 'text', 
    success: function (data, status) { 
     alert(data.TotalValue + " " + status) //"undefined success" 
    }, 
    error: function() { 
     alert("error!") 
    } 
}); 
} 

I "undefined Erfolg" in der Warnung bekommen. "Daten" ist das gesamte HTML-Dokument, kein "Lottery" -Objekt.

The erstellenWebMethod und die Lotterie Klasse:

[WebMethod] 
public static Lottery Create(Lottery lottery) 
{ 
    return lottery; 
} 
public class Lottery 
{ 
    public string TotalValue { get; set; } 
    public string Players { get; set; } 
} 

ich nicht herausfinden können, was genau das gleiche Objekt vor sich geht, wird die WebMethod Rückkehr, dass sie empfangen, wie ich Kann auf den Erfolgsrückruf nicht zugreifen?

BEARBEITEN: Die WebMethod wird nicht getroffen. Der "ScriptManager" ist in default.aspx mit EnablePageMethods festgelegt auf True. Wenn ich den WebMethod-Namen (Create) in irgendwas ändere und in AJAX-URL/Create behalten, bekomme ich immer noch den ganzen default.aspx-HTML als Antwort.

+0

Hinweis: Beschwerden über Downvotes bringen wahrscheinlich nur mehr Downvotes. –

+0

Ich habe es entfernt. Kannst du nicht helfen, anstatt dieser unfreundlichen Behandlung? Vielleicht hilft mir Ihre Ablehnung einer legitimen Frage wirklich. Vielen Dank. – Tiago

+1

Ich glaube nicht, dass es funktioniert, das "ganze Dokument" ist wahrscheinlich eine 404 oder 500 HTTP-Antwort. Hast du tatsächlich den Inhalt von 'Daten' betrachtet? – Crowcoder

Antwort

0

Ich denke, es gibt zwei Dinge, die Sie haben zu prüfen:

Zunächst einmal: Sie werden den Inhaltstyp-Header zu korrigieren. Es sollte application/json statt text sein.

Das andere Problem ist, dass [WebMethod] XML erwartet. Es behandelt nicht JSON out of the box.

Damit Ihr WebMethod seinen Inhalt als JSON formatiert zurückgibt, müssen Sie zusätzlich als ScriptMethod verzieren. Mit diesem Attribut können Sie das Format der Antwort als JSON angeben.

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public static Lottery Create(Lottery lottery) 
{ 
    // ... 
} 

Nun, aber es gibt eine Sache, die ich nicht sicher bin: Während Sie die ResponseFormat angeben kann ich nicht sehen, eine Möglichkeit, die RequestFormat angeben. I angenommen akzeptiert es JSON als Anforderungstyp, wenn Sie es als Antworttyp definieren. Aber gut, das ist nur eine Annahme. Probieren Sie es aus ;-)

+0

Ich habe alles versucht, was Sie gesagt haben, ohne Erfolg. Das Problem scheint zu sein, dass der WebMethod nie getroffen wird. Der "ScriptManager" ist auf default.aspx vorhanden – Tiago

+0

Schade :(Es könnte eine gute Idee sein, fiddler parallel zu starten, um den http-Verkehr abzufangen und zu sehen, ob das zusätzliche Hinweise gibt. – khlr

+0

Ich habe gerade den WebMethod-Namen in irgendeinen Zufall geändert name und behalten die url (/ Create) in AJAX.Ich bekomme immer noch die ganze HTML. – Tiago

0

Wir können nicht sagen, warum es nicht für Sie funktioniert, aber vielleicht könnten Sie einen anderen Ansatz versuchen. [WebMethod] ist meiner Meinung nach ziemlich hacky und anscheinend komplizierter als in der Notwendigkeit zu sein. Sie können Ihrem Projekt einen WebAPI-Dienst hinzufügen, aber wenn Sie bei Webformularen der "alten Schule" bleiben möchten, können Sie eine IHttpHandler als Aschx-Datei implementieren, die ein "Webdienst" ist. Beachten Sie, dass ASPX-Seiten auch IHttpHandler implementieren, aber sie sind so konzipiert, dass sie HTML zurückgeben, während Handler für die generische Anfrageverarbeitung wie Dateidownloads und Daten wie xml und json gedacht sind.

Implementieren Sie so etwas wie dies mit der Handler Elementvorlage und drücken Sie sie mit Ihrem Ajax-Aufruf:

using System.IO; 
using System.Web; 

namespace WebApplication1 
{ 
    public class LotteryHandler : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
      context.Response.ContentType = "application/json"; 

      using (var reader = new StreamReader(context.Request.InputStream)) 
      { 
       string values = reader.ReadToEnd(); 

       //Use Newtonsoft to deserialize to Lottery type 

       //do whatever with Lottery 

       //Use Newtonsoft to serialize Lottery again (or whatever you want to return) 

       context.Response.Write(your_serialized_object); 

       //finish the response 
       context.Response.Flush(); 
       HttpContext.Current.ApplicationInstance.CompleteRequest(); 
      } 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 
    } 
} 
0

** alter Code **

$.ajax({ 
    type: 'POST', 
    url: 'default.aspx/Create', 
    data: JSON.stringify({ data: lottery }), 
    dataType: 'text', 
    success: function (data, status) { 
     alert(data.TotalValue + " " + status) //"undefined success" 
    }, 
    error: function() { 
     alert("error!") 
    } 
}); 

** Neu-Code **

Inhaltstyp und Datentyp hier ändern

$.ajax({ 
     type: 'POST', 
     url: 'default.aspx/Create', 
     data: JSON.stringify({ data: lottery }), 
    contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (data, status) { 
      alert(data.TotalValue + " " + status) //"undefined success" 
     }, 
     error: function() { 
      alert("error!") 
     } 
    }); 
Verwandte Themen