2016-09-28 2 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

Проблема заключается в тха t вы отправляете и кодируете строку формы в свою службу WebAPI с помощью $ («form»). serialize(). Это преобразует форму в строку «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); 
}); 

Обратите внимание на пользовательскую функцию, serializeUserRequest(), который производит запрос JSON объект, соответствующий параметр на стороне сервера WebAPI.

$.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 (IE: «DisplayName», «FirstName», и т.д.). Кроме того, чтобы разделить атрибуты формы между этими двумя корневыми объектами, я добавил «rel_» к полям, которые сопоставляются с объектом «Отношения», и все другие имена полей будут отображаться в UserInfo.

Пример:

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

Ваш подход, что я сделал в одной точке. Однако в итоге я изменил такие поля, как: name = "UserInfo [Profile] [Cell]". Кроме того, я добавил отдельный класс для каждого поля class = "myform", и я сериализую форму: var frm = $ ('form .myform'). Serialize(); my ajax: данные: frm – alwaysVBNET

Смежные вопросы