2013-11-01 62 views
0

我已经在这里好几个小时了,但仍然没有得到它的正确...有人请让我摆脱我的痛苦!Json对象没有被传递给web api方法

的javascript:

 var calcParams = {} 
     calcParams.calcName="gwp_mat"; 
     calcParams.components=124.332; 

     //return manager.impactCalc(calcName, componentArray) 
     return postData("{calcParams2:" + JSON.stringify(calcParams) + "}") 
      .then(querySucceeded) 
      .fail(queryFailed); 


    function postData(cp) { 
     $.ajax({ 
      type: "POST", 
      dataType: "json", 
      contentType: "application/json", 
      url: "/api/breeze/testCalc", 
      data: cp, 
      success: function (data) { 
       alert(data); 
       return data; 
      }, 
      error: function (error) { 
       jsonValue = jQuery.parseJSON(error.responseText); 
      } 
     }); 
    } 

型号:

Public Class calcParams2 
    Public calcName As String 
    Public calcNumber As Double 
End Class 

Server代码:

<System.Web.Services.WebMethod()> _ 
Public Function testCalc(cp As calcParams2) As Double 
    Dim c As New calcs 
    Return cp.calcNumber 
End Function 

如果我调试它,在JavaScript POSTDATA功能的 “CP” 参数是:

"{calcParams2:{"calcName":"gwp_mat","components":124.332}}" 

,但在我的web方法,calcname是“一无所有”和组件是“0.0”

如果我不使用JSON.Stringify我在Web方法得到一个空对象。我想我有一个代码版本,其中calcName被传递,但组件值仍然为零。那是当我刚才调用“返回postData(JSON.stringify(calcParams))”我想。

回答

1

你只需要在JSON发送的对象参数:

return postData(JSON.stringify(calcParams)) ... 

但是你的jQuery对象必须具有相同的参数名称为您的服务器对象。改变你的服务对象是:

Public Class calcParams2 
    Public calcName As String 
    Public components As Double 
End Class 

或更改您的客户端对象:

var calcParams = {} 
calcParams.calcName="gwp_mat"; 
calcParams.calcNumber=124.332; 
+0

的jQuery做所有的编码/字符串化的你 - 你可以直接传递对象。除了按照建议进行服务器端编辑之外,OP应该这样做:'return postData({calcParams2:calcParams})' – Adam

+0

Doh!我创建了“calcparams2”作为复制测试,并忘记更改第二个属性名称。男人,那是愚蠢的。然而......只有乔尼S的答案有效。我必须在那里有JSON.stringify调用,否则web方法什么都不会收到。我试过({calcParams2:calcParams}),没有任何东西可以通过。出于某种原因,我需要在那里“串起来”才能起作用。我不知道为什么... – TheMook