将多个对象从 Ajax 传递到 WebMethod

Pass multiple objects from Ajax to WebMethod

我正在将信息从我的 form 传递到我的 WebMethod。目标是用表单中的数据填充 UseInfo 对象,并填充我在 NewUser class 上添加的一些属性,这些属性也是从 ajax 请求传递的.

当我将 UserInfo 作为输入参数时,对象在 ajax post 之后成功填充。但是,如果我有 NewUser 对象,则只有 属性 Relationship 被填充,但 UserInfo 对象显示为 Nothing。

知道我做错了什么吗?我需要为我的 class NewUser 提供不同的结构吗?

新用户class

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

问题是您正在使用 $("form").serialize() 将表单字符串发送和编码到您的 WebAPI 服务。这会将表单转换为字符串 "field1=value1&field2=value2&field3=value3" 到您的 WebAPI 请求中的对象。所以 .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);
});

请注意生成与服务器端 WebAPI 参数匹配的 json 请求对象的自定义函数 serializeUserRequest()。

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

为此,我假设您将表单字段名称设置为与 UserInfo/Relationship 对象属性相同(即:"DisplayName"、"FirstName" 等)。此外,为了在这两个根对象之间拆分表单属性,我将 "rel_" 添加到映射到 Relationship 对象的字段,所有其他字段名称将映射到 UserInfo。

示例:

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