在函数内部时,我可以获得它的参数名称/值吗?
我希望将它们转换为我可以 JSON.stringify() 的对象,以便我可以将其作为数据传递给 ajax 调用。
[编辑] 感谢其他人为我指明了正确的方向,我有一个解决方案可以动态创建与 webmethod 匹配的参数以及与 webmethod 匹配的客户端存根。我认为,这有助于使事情更具可读性。
[EDIT2] 更进一步。现在 javascript 中的函数名称必须与 webmethod 的名称匹配,现在您将 webmethod 所在的页面作为第一个参数传递给它。它动态地获取客户端 javascript 函数名称,这就是它现在正在寻找的 webmethod 的名称。
以下是您在代码中某处创建的常用方法:
function WebMethodCall(args) {
// in your stubs call this to get argname/value pairings in JSON form
var params = JSONArgs(args);
var fun = GetFunctionName(args);
// make a call to the webmethod via ajax using json
AjaxPostJSON(args[0] + "/" + fun, params, args);
}
function JSONArgs(args) {
var tmp = args.callee.toString().match(/\(.*?\)/)[0];
var argumentNames = tmp.replace(/[()\s]/g, '').split(',');
var param = new Object();
for (var i = 0; i < argumentNames.length; i++) {
param[argumentNames[i]] = args[i];
}
return JSON.stringify(param);
}
function GetFunctionName(args) {
var fName = args.callee.toString().match(/function ([^\(]+)/)[1]
return fName;
}
function AjaxPostJSON(url, data, args) {
var objGetData = new Object();
var fun = GetFunctionName(args);
var s = "On" + fun + "Success";
var f = "On" + fun + "Failure";
objGetData.url = url;
objGetData.type = "POST";
objGetData.data = data;
objGetData.contentType = "application/json; charset=utf-8";
objGetData.dataType = "json";
objGetData.success = window[s];
objGetData.error = window[f];
$.ajax(objGetData);
}
参数名称应与 webmethod 参数名称匹配的存根。函数名也必须与 webmethod 函数名匹配。请注意,page 必须是第一个参数,但不应出现在您的 web 方法中。它在这里只是用来使调用正确: // function stub function GetData(page, id, name) { WebMethodCall(arguments); }
注意“On” + func_name + “Success”/“Failure”的成功和失败名称模式。用法:
function Button2_onclick() {
// call client side stub that matches the webmethod
GetData("Default.aspx", 8, "Bob");
}
// automatically registers these as success/error
function OnGetDataSuccess(data) {
alert(data.d);
}
function OnGetDataFailure(data) {
alert("failure");
}
我认为,这样做的好处是,当我更改/添加参数到我的 webmethod 时,很容易获取客户端 javascript 方法并更改参数名称以匹配 webmethod,仅此而已。