2016-09-28 5 views
0

Ich übermittle Informationen von meinem form an meine WebMethod. Das Ziel besteht darin, das UseInfo-Objekt mit den Daten aus dem Formular aufzufüllen und auch einige Eigenschaften, die ich der Klasse NewUser hinzugefügt habe, zu füllen, die auch von der Ajax-Anforderung übergeben werden.Mehrere Objekte von Ajax an WebMethod übergeben

Wenn ich als Eingangsparameter die UserInfo habe, füllt das Objekt erfolgreich nach dem Ajax-Post. Wenn ich jedoch das NewUser-Objekt habe, wird nur die Eigenschaft Relationship aufgefüllt, aber das Objekt UserInfo erscheint als Nothing.

Irgendwelche Ideen, was ich falsch mache? Muss ich meiner Klasse eine andere Struktur geben? NewUser?

NewUser Klasse

Public Class NewUser 

     Public Property UserInfo As UserInfo 
      Get 
       Return _UserInfo 
      End Get 
      Set(value As UserInfo) 
       _UserInfo = value 
      End Set 
     End Property 
     Private _UserInfo As UserInfo 

     Public Property Relationship As String 
      Get 
       Return m_Relationship 
      End Get 
      Set(value As String) 
       m_Relationship = value 
      End Set 
     End Property 
     Private m_Relationship As String 

    End Class 

WebMethod

<HttpPost> 
<ValidateAntiForgeryToken> 
<DnnModuleAuthorize(AccessLevel:=SecurityAccessLevel.View)> 
    Public Function AddUserDependant(<FromBody> oNewUser As NewUser) As HttpResponseMessage 
     Try 
      If Me.UserInfo.IsInRole("Carer") Then 
       UsersControllerOmni.CreateDnnUser(oNewUser.UserInfo) 

       Return Request.CreateResponse(HttpStatusCode.OK) 
      Else 
       Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "") 
      End If 
     Catch ex As Exception 
      Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex) 
     End Try 

    End Function 

AJAX

$.ajax({ 
     type: "POST", 
     cache: false, 
     url: serviceUrl + "/ModuleTask/AddUserDependant", 
     beforeSend: sf.setModuleHeaders, 
     contentType: "application/json; charset=utf-8", 
     headers: {'Content-Type': 'application/x-www-form-urlencoded'}, 
     data: $("form").serialize() 
    }).done(function (result) { 


    }).fail(function (xhr, result, status) { 
     alert(result); 
    }); 

Antwort

1

Das Problem ist tha t Sie senden und codieren Formzeichenfolge an Ihren WebAPI-Dienst mit dem $ ("form"). serialize(). Dadurch wird das Formular in einen String "Feld1 = Wert1 & Feld2 = Wert2 & Feld3 = Wert3" in ein Objekt in Ihrer WebAPI-Anforderung konvertiert. Also wird .NET versuchen, das zu einem einfachen Objekt zu konvertieren.

Um Ihre Anfrage in das Objekt zu bekommen, das Sie haben, würde ich vorschlagen, Ihren Ajax zu ändern, um den Inhaltstyp 'json' zu senden.

Fügen Sie dann eine Methode hinzu, um die Formularserialisierung für das Clientobjekt zu steuern.

$.ajax({ 
     type: "POST", 
     cache: false, 
     url: serviceUrl + "/ModuleTask/AddUserDependant", 
     beforeSend: sf.setModuleHeaders, 
     contentType: "application/json; charset=utf-8", 
     dataType: 'json', 
     data: $('form').serializeUserRequest() 
}).done(function (result) { 
}).fail(function (xhr, result, status) { 
     alert(result); 
}); 

Hinweis die benutzerdefinierte Funktion, serializeUserRequest(), die erzeugt das json Anforderungsobjekt, der die serverseitige WebAPI Parameter übereinstimmt.

$.fn.serializeUserRequest = function() 
{ 
    var requestObj = { "UserInfo": {}, "Relationship": {} }; 
    var formData = this.serializeArray(); 
    $.each(formData , function(i, fd) { 
     if (fd.name.indexOf("rel_") == 0) { 
      var fld = fd.name.substring(4); 
      requestObj.Relationship[fld] = fd.value; 
     } else { 
      requestObj.UserInfo[fd.name] = fd.value; 
     } 
    }); 
    return requestObj; 
}; 

Damit dies funktioniert, ist meine Vermutung, dass Sie Ihre Form Feldnamen die gleichen wie die Userinfo/Relationship Objekteigenschaften (IE: „Displayname“, „Vorname“, usw.) machen. Um die Formularattribute zwischen diesen beiden Stammobjekten aufzuteilen, fügte ich außerdem "rel_" den Feldern hinzu, die dem Beziehungsobjekt zugeordnet sind, und alle anderen Feldnamen werden der UserInfo zugeordnet.

Beispiel:

<input type="text" name="rel_Name" maxlength="50" size="50"/> 
+0

Ihr Ansatz ist es, was ich an einem Punkt tat. Ich habe jedoch die Felder wie folgt geändert: name = "UserInfo [Profile] [Cell]". Außerdem habe ich für jede Feldklasse eine eigene Klasse = "myform" hinzugefügt und das Formular wie folgt serialisiert: var frm = $ ('form .myform'). Serialize(); mein Ajax: Daten: frm – alwaysVBNET

Verwandte Themen