我在一个控件上调用一个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]
答案 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,而不是传递函数引用。简单而有效。