2016-09-28 120 views
0

我將信息從我的form傳遞到我的WebMethod。目標是用表單中的數據填充UseInfo對象,並填充NewUser類中添加的一些屬性,這些屬性也是從ajax請求傳遞的。將多個對象從Ajax傳遞到WebMethod

當我有一個輸入參數UserInfo時,對象在ajax帖子後成功填充。但是,如果我有NewUser對象,則只有屬性Relationship會填充,但UserInfo對象顯示爲Nothing。

任何想法我做錯了什麼?我是否需要爲我的課程NewUser提供不同的結構?

NEWUSER類

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); 
    }); 

回答

1

的問題是THA你用$(「form」)。serialize()發送和編碼表單字符串到你的WebAPI服務。這會將表單轉換爲WebAPI請求中的對象的字段「field1 = value1 & field2 = value2 & field3 = value3」。所以.NET會嘗試將它轉換爲一個簡單的對象。

爲了讓你的請求適合你的對象,我建議改變你的ajax發送內容類型'json'。

然後添加一個方法來控制窗體序列化到客戶端對象。

$.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); 
}); 

通知自定義函數,serializeUserRequest(),即產生服務器端的WebAPI參數相匹配的JSON請求對象。

$.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; 
}; 

對於這項工作,我的假設是,你讓你的表單字段名稱相同的用戶信息/關係對象的屬性(IE:「顯示名稱」,「姓」,等等)。此外,爲了拆分這兩個根對象之間的表單屬性,我將「rel_」添加到映射到Relationship對象的字段,並將所有其他字段名稱映射到UserInfo。

例子:

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

你的方法是什麼我做在一個點上。但是,我最後修改了諸如:name =「UserInfo [Profile] [Cell]」等字段。另外,我在每個字段class =「myform」上添加了一個獨特的類,並且序列化如下形式:var frm = $('form .myform')。serialize();我的ajax:data:frm – alwaysVBNET