2016-06-20 10 views
0

Ich arbeite an einem VB.NET-Webformular-Projekt, und ich versuche, Ajax zu verwenden, um eine Funktion aufzurufen, die ein Objekt dann in HTML zurückgeben würde.Ajax-Funktion gibt zurück "Anforderung ist in diesem Kontext nicht verfügbar"

Hier ist meine Ajax-Aufruf:

$(document).ready(function() { 
    msgClickedClass.click(function (event) { 
     msgID = event.target.id; 
     //Get message body 
     $.ajax({ 
      type: "POST", 
      url: "/secure/PortalMessages.aspx/PrintMessageContent", 
      data: JSON.stringify({ "msgID": msgID }), 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'json', 
      success: function (data) { 
       // $("#dialogText").html(data.d.message); 

       alert("success"); 
      }, 
      error: function (xhr, status, error) { 
       alert('Error: ' + status + '\nError Text: ' + error); 
      } 
     }) //end ajax 


    }); //end click function 
    }); 

Hier ist Funktion mein vb von Ajax aufgerufen wird:

<WebMethod()> _ 
Public Shared Function PrintMessageContent(msgID As Integer) As Messages 
    Dim msg As New Messages 

    Dim db As New DB_SQL() 

    msg = db.GetSpecificMessageSent(msgID) 
    Return msg 
End Function 

Wenn ich den Code debuggen, ich ein Nachrichten tun haben Objekt, das zurückgegeben werden soll , aber die Ajax-Funktion schlägt fehl und gibt stattdessen einen 500-Fehler zurück, der besagt, dass "Anforderung in diesem Kontext nicht verfügbar ist".

Wenn ich meine PrintMessageContent ändern, um eine Zeichenfolge anstelle eines Objekts zurückzugeben, ist die Ajax-Funktion erfolgreich.

Alle Vorschläge würden sehr geschätzt werden.

Update: Hier ist, was meine Nachrichten Klasse sieht aus wie

Public Class Messages 
Private _TimeStamp As DateTime 
Private _Subject As String 
Private _Message As String 
Private _Agent As String 
Private _Id As Integer 
Private _MessageViewHistory As List(Of MessagesViewed) 

Public Property TimeStamp() As DateTime 
    Get 
     Return _TimeStamp 
    End Get 
    Set(value As DateTime) 
     _TimeStamp = value 
    End Set 
End Property 

Public Property Subject() As String 
    Get 
     Return _Subject 
    End Get 
    Set(value As String) 
     _Subject = value 
    End Set 
End Property 

Public Property Message() As String 
    Get 
     Return _Message 
    End Get 
    Set(value As String) 
     _Message = value 
    End Set 
End Property 

Public Property Agent() As String 
    Get 
     Return _Agent 
    End Get 
    Set(value As String) 
     _Agent = value 
    End Set 
End Property 

Public Property Id() As Integer 
    Get 
     Return _Id 
    End Get 
    Set(value As Integer) 
     _Id = value 
    End Set 
End Property 



Public Property MessageViews() As List(Of MessagesViewed) 
    Get 
     Return _MessageViewHistory 
    End Get 
    Set(value As List(Of MessagesViewed)) 
     _MessageViewHistory = value 

    End Set 
End Property 

Public Property MessageHTMLFormat() As String 
    Get 
     Dim retn As String 
     retn = Me.Message.Replace(vbCrLf, "<br />") 
     Return retn 

    End Get 
    Set(value As String) 

    End Set 
End Property 



End Class 

Update # 2: Neue Funktion:

<WebMethod()> _ 
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _ 
Public Shared Function PrintMessageContent(msgID As Integer) As String 
    Dim msg As New Messages 

    Dim db As New DB_SQL() 

    msg = db.GetSpecificMessageSent(msgID) 

    Dim serializer As New JavaScriptSerializer() 
    Dim serializedResult = serializer.Serialize(msg) 
    Return serializedResult 
End Function 
+0

Was ist "Nachrichten"? Um den Wert von webmethod zu erhalten, gibt es ein json-Objekt zurück. Sie sollten dies durch "data.d" -Eigenschaft erhalten ... Auch versuchen, 'Daten: JSON ...' ** zu ** 'Daten: '{msgID:' + JSON.stringify (msgID) + '}'' zu ändern – Codexer

+0

@Zaggler, ich habe versucht, mit 'data.d' auf den Wert zuzugreifen, aber die Erfolgsfunktion wird nie aufgerufen. Ich habe auch 'Daten: JSON ...' geändert, wie Sie vorgeschlagen haben, aber ich bekomme immer noch die gleiche Fehlermeldung. Ich habe meine Frage auch aktualisiert, um die Nachrichtenklasse einzuschließen. – bongo700

+0

Es ist möglich, dass 'db.GetSpecificMessageSent (msgID)' nichts zurückgibt oder etwas tatsächlich fehlschlägt, 'Nachrichten' zurück zu liefern ... Wenn Sie den gesamten Code innerhalb der Methode auskommentieren und einfach' Return msg. ToString() 'und dann den Rückgabetyp in' String' ändern, erhalten Sie die Nachrichten-ID zurück? – Codexer

Antwort

0

Firs aller definierten Sie Datentyp als JSON zurückgegeben, so dass Sie muss Rückgabetyp angeben:

<WebMethod()> _ 
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _ 

An der Spitze der th e-Datei benötigen Sie Script-Dienst

Inherits System.Web.Services.WebService 

Und schließlich haben Sie angeben, Ihr Objekt JSON

Dim serializer As New JavaScriptSerializer() 
Dim serializedResult = serializer.Serialize(db.GetSpecificMessageSent(msgID)) 
Return serializedResult 

UPDATE ich bemerkt habe zu konvertieren, dass Sie Objekt von Ajax JSON.stringify({ "msgID": msgID }) aber nie Deserialisierung senden verwenden . Was ist der Zweck, das zu tun? Wie auch immer, Sie schicken einfach die ID, damit Sie Ihren Code wie folgt ändern können:

url: "/secure/PortalMessages.aspx/PrintMessageContent", 
data: { "msgID": msgID }, 
dataType: 'json', 

Dies sollte auch helfen.

Eigentlich, wenn Sie immer noch bevorzugen, stringify wo ist ein kleiner Fehler im Format. Ich hatte den gleichen Fehler im Webservice. Versuchen Sie das:

Dieses Format hilft Ihnen, Fehler wie zu vermeiden: Kann JSON-Primitive nicht analysieren.

+0

Ich habe meine Funktion zu dem geändert, was Sie vorgeschlagen haben, aber ich bekomme immer noch dieselbe Fehlermeldung. Fehle ich etwas? Aktualisierte Funktion in Frage. – bongo700

+0

Nein, hast du nicht. Überprüfen Sie zuerst mein Update. Und zweitens trifft es den Break-Point in PrintMessageContent? – SouXin

+0

Ja, es trifft den Breakpoint in PrintMessageContent. – bongo700

0

Ich fand heraus, dass das Problem in meiner Nachrichtenklasse war. Aus irgendeinem Grund, wenn ich ein Nachrichtenobjekt betrachtete, gab es viel mehr als nur die angegebenen Eigenschaften zurück. Es gab Dinge wie Buffer, Content-Type, etc.

Ich habe meine Nachrichten-Klasse in diese geändert, und wenn ich den Mauszeiger über das Nachrichten-Objekt halten würde, würde es nur die angegebenen Eigenschaften geben.

Hofft, dies spart jemand Zeit und Mühe.

Public Class Messages 

Public TimeStamp As DateTime 
Public Subject As String 
Public Message As String 
Public Agent As String 
Public Id As Integer 
Public MessageViews As List(Of MessagesViewed) 

End Class