前台前台代碼:
<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); }
