前台前台代码:
<script> function Sum() { dojo.ready ( function () { //这里组织的Json对象的Key必须和后台服务函数的参数一致,不然导致请求服务失败 var paraData = dojo.toJson({ "Value1": dojo.byId("t_a").value, "Value2": dojo.byId("t_b").value }); var xhrArgs = { url: "TestAjAx.aspx/Sum", handleAs: "json", headers: { "Content-Type": "application/json" }, postData: paraData, load: function (response, ioArgs) { ResFun(response) },//成功后回调函数 error: function (error, ioArgs) { alert(error.message); }//出错时回调函数 }; dojo.xhrPost(xhrArgs); } ); } function ResFun(response) { var result = eval("(" + response.d + ")");//通过后台服务函数返回的是Object,需要取值(.d) //为什么要 eval这里要添加 “("("+data+")");//”呢? //原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。 //加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语 句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始 和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的: //alert(eval("{}"); // return undefined //alert(eval("({})");// return object[Object] //对于这种写法,在JS中,可以到处看到。 //如: (function()) {}(); 做闭包操作时等。 dojo.byId("d_result").innerHTML = result.Value1 + " + " + result.Value2 + " = " + result.SumValue; } </script>
HTML:
<body> <div> <table> <tr> <td>数值1:</td> <td><input type="text" id="t_a" /></td> <td>数值2:</td> <td><input type="text" id="t_b" /></td> <td><button id="b_Add" onclick="Sum()">计算</button></td> <td><div id="d_result"></div></td> </tr> </table> </div> </body>
后台代码:
[WebMethod] public static string Sum(string Value1,string Value2) { int v1 = 0; int v2 = 1; int.TryParse(Value1,out v1); int.TryParse(Value2,out v2); var result = new { Value1 = Value1, Value2 = Value2, SumValue = v1 + v2 }; return JsonConvert.SerializeObject(result); }