有两种不同签名的方法,jquery没有调用正确的方法

时间:2010-06-15 16:07:13

标签: c# jquery

有两种方法GetUserAssignedSystems()GetUserAssignedSystems(string Id) 这些方法的行为彼此截然不同。问题是,当我想调用GetUserAssignedSystems(string Id)时,会调用无参数方法。

以下是方法:

[WebMethod]
[ScriptMethod]
public IEnumerable GetUserAssignedSystems(string cacId)
{
    return Data.UserManager.GetUserAssingedSystems(cacId);
}

[WebMethod]
[ScriptMethod]
public IEnumerable GetUserAssignedSystems()
{
    //do something else
}

这是调用的jQuery:

CallMfttService("ServiceLayer/UserManager.asmx/GetUserAssignedSystems", 
        "{'cacId':'" + $('#EditUserCacId').val() + "'}", function(result) {
            for (var userSystem in result.d) {
                $('input[UserSystemID=' + result.d[userSystem] + ']').attr(
                    'checked', 'true');
            }
        });

为什么忽略这种方法的任何想法?

更新

以下是CallMfttService的代码

function CallMfttService(method, jsonParameters, successCallback, errorCallback){
if (errorCallback == undefined)
{
    errorCallback = function(xhr)
    {
        if (xhr.status == 501)
        {
            alert(xhr.statusText);
        }
        else
        {
            alert("Unexpected Error");
        }
    }
}

$.ajax({
    type: "POST",
    url: method,
    data: jsonParameters,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: successCallback,
    error: errorCallback
});

}

3 个答案:

答案 0 :(得分:4)

Javascript不支持重载函数(具有相同名称且接受不同参数的多个函数),其方式与某些语言相同。如果您需要它根据输入参数的存在选择性地执行任务,您必须在函数中添加检查以确定变量是否已通过if ( param == undefined) {},然后根据是否存在以适当的方式运行说变量。使用不同的参数重新定义函数两次将不起作用。

根据更新,请尝试更改您的通话:

CallMfttService("ServiceLayer/UserManager.asmx/GetUserAssignedSystems", 
    {'cacId': $('#EditUserCacId').val() }, function(result) {
        for (var userSystem in result.d) {
            $('input[UserSystemID=' + result.d[userSystem] + ']').attr(
                'checked', 'true');
        }
    });

基本上你传递的是字符串,而不是jQuery $ .ajax方法的对象,这可能会阻止你的值正确到达服务器。让我知道这是怎么回事。

答案 1 :(得分:0)

我不确定您是要发送JSON还是普通对象文字。但在第一种情况下,您的JSON无效...... JSON需要围绕字符串和键的双引号:

 CallMfttService("ServiceLayer/UserManager.asmx/GetUserAssignedSystems", '{"cacId":"' + $('#EditUserCacId').val() + '"}', function(result) {

不知道CallMfttService做了什么,很难说,但我也会尝试这样做:

CallMfttService("ServiceLayer/UserManager.asmx/GetUserAssignedSystems", {cacId:   $('#EditUserCacId').val()}, function(result) {

答案 2 :(得分:0)

我遇到了一个类似的问题,即没有调用正确的C#WebMethod。我收到“资源未找到错误”。似乎无论出于何种原因(我不确定为什么,也许其他人可以详细说明),WebMethod类不喜欢重载方法。它错误地解释了传递参数的类型。如果我删除C#WebMethod类中的所有重载方法并且只保留一个,无论我留下哪一个,它现在都会被调用并按预期工作。