0

在函数内部时,我可以获得它的参数名称/值吗?

我希望将它们转换为我可以 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,仅此而已。

4

4 回答 4

1

您可以使用arguments对象获取值。名称有点棘手,您必须解析函数的字符串表示形式。

我更喜欢直接将对象传递给函数:myFunction({name: value})并将该对象直接传递给JSON.stringify.

于 2012-11-22T13:37:52.900 回答
1

如果我理解你,你想获得变量的“名称”作为“值”,如果是这样,不,你不能,变量名称只是一个符号,可以帮助你作为程序员区分它们,但是您无法获取“元数据”信息,这就是为什么我们现在更喜欢使用 json 来提供更有意义的对象作为数据传输对象。

于 2012-11-22T13:38:06.910 回答
1

这有帮助吗?:

function test (name, pass){
    var params = (test.toString().substring(test.toString().indexOf('(')+ 1, test.toString().indexOf(')'))).replace(/ /g, '').split(',');
    var obj = new Object();
    var js = "";
for(var i=0;i<arguments.length;i++){
        js += 'obj.'+ params[i]+' = "'+ arguments[i]+'";';
    }
     eval(js);
     JSON.stringify(obj);
}
于 2012-11-22T13:45:18.210 回答
0

是的,你可以......但这真的是一件简单的事情,谷歌会有所帮助

function myFunction(name,job) {
 alert("Welcome " + name + ", the " + job);
}
于 2012-11-22T13:35:22.303 回答