在Javascript ASP.NET Ajax回调函数中获取对调用对象的引用?

时间:2011-04-01 15:46:41

标签: javascript jquery asp.net-ajax

我在一个控件上调用一个ASP.NET Ajax方法(例如一个用[Ajax.AjaxMethod]标记的方法),当用户点击一个链接时,该控件是在JavaScript中动态创建的(基本上它在一个表内,当单击链接,在JS代码中构建tr / td并添加到表中)。在回调函数中,我需要知道正在调用哪一行,因为我只是将数据附加到该行中的输入控件;我有一个隐藏字段,其中包含添加的项目总数,但我不能使用它,因为它总是添加到 last 行(因为它在添加新行时会增加)而不是行正在解雇这个功能。

如下所示:

// fieldName is a lookup string...
function loadOperators(fieldName) { 
    MyPage.LoadOperatorsFor(fieldName, loadOperators_Callback);
}

function loadOperators_Callback(response) { 
    var currentRow = // how to obtain this?

    // do other stuff here...
} 

我也在使用jQuery,但这些方法是以ASP.NET AJAX风格完成的,因为这是我们在工作中使用的当前样式。

我如何确定触发Ajax函数的实际行,所以我只填充该行中包含的下拉列表(我不能依赖用户创建一行,然后填充该行;他们可能会创建说5行然后回到第2行并选择一些东西,所以我必须知道他们在第2行而不是3/4/5中选择了一个值?它似乎不是响应对象的一部分,但Callback函数似乎没有采用任何其他参数。

我唯一能想到的就是将它添加到我的AjaxMethod中,以便它会在响应中传回来,但这似乎是一个hack,因为我返回一个DataSet并且行号没有关系数据。

我忘了添加,我使用ASP.NET AJAX库,只有jQuery和标记方法[Ajax.AjaxMethod]

4 个答案:

答案 0 :(得分:1)

您需要传递委托作为回调参数

function loadOperators(fieldName) { 
    MyPage.LoadOperatorsFor(fieldName, Function.createDelegate({"fieldName":fieldName},loadOperators_Callback));
}

在你的回调中你可以

function loadOperators_Callback(response) { 
    var currentRow = this.fieldName;
    // do other stuff here...
} 

答案 1 :(得分:1)

所有ASP.NET AJAX Web服务javascript代理允许您传递如下上下文:

MyPage.LoadOperatorsFor(fieldName, loadOperators_CallBack,
                        loadOperators_Error, context);

loadOperators_Error是您的错误处理程序,context可以是您想要的任何内容 - 在您的情况下,传入currentRow。

然后在您的回复中,您将拥有:

function loadOperators_CallBack(response, context) {
   // context is your currentRow value
}

答案 2 :(得分:1)

// fieldName is a lookup string...
function loadOperators(fieldName) { 
    // assume this is a click handler on the row
    // if it isn't somehow get the row.
    var row = $(this);
    MyPage.LoadOperatorsFor(fieldName, loadOperators_Callback.bind(row));
}

function loadOperators_Callback(response) { 
    var currentRow = this;

    // do other stuff here...
} 

获取loadOperators函数中的行,然后将this范围绑定到回调中的行。您可能需要在IE< 9中模拟Function.prototype.bind。我建议_.bind进行模拟。

您可以使用$.proxy(row, loadOperators_Callback)进行此操作。

答案 3 :(得分:0)

对于记录,我能够通过简单地使用内联匿名函数来解决这个问题,因此我可以从调用方法引用lineNumber,而不是传递函数引用。简单而有效。