2011-04-01 46 views
1

我在一個控件上調用一個ASP.NET Ajax方法(例如一個標記爲[Ajax.AjaxMethod]的方法),該控件在用戶點擊一個鏈接時動態地用JavaScript創建(基本上它在一個表內,並且當鏈接被點擊時tr/td在JS代碼中構建並添加到表中)。在回調函數中,我需要知道哪個行被調用,因爲我只將數據附加到該行中的輸入控件;我有一個隱藏字段,其中包含已添加的項目總數,但我無法使用它,因爲它總是添加到最後一個行(因爲它是在添加新行時增加的)而不是激發該函數的行。獲取對Javascript ASP.NET Ajax回調函數中調用對象的引用?

類似以下內容:

// 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)?它似乎不是響應對象的一部分,但回調函數似乎沒有采用任何附加參數。

我能想到的唯一的事情就是將它添加到我的AjaxMethod中,以便它可以在響應中傳回,但是由於我返回一個DataSet並且行號沒有方向,所以這看起來好像是一個黑客關於數據。

我忘了補充,我使用ASP.NET AJAX庫,只有jQuery和與[Ajax.AjaxMethod]

+0

將當前行從服務器傳遞到您的ajax回調中 – Raynos 2011-04-01 15:54:11

+0

除非我在我編輯的最後一段中說到,否則當前行只存在於客戶端而不是服務器端。 – 2011-04-01 15:55:41

回答

0

爲了記錄,我能夠通過簡單地使用內聯匿名函數來解決這個問題,所以我可以從調用方法中引用lineNumber,而不是傳遞函數引用。簡單而有效。

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

所有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 
} 
+0

我想這樣如下:MyPage.LoadOperatorsFor(fieldName,loadOperators_Callback,null,lineNumber)但在回調中,lineNumber返回爲未定義。有任何想法嗎? – 2011-04-01 16:16:49

+0

這裏有一些關於方法結構的附加信息 - [Service methods](http://www.asp.net/ajaxlibrary/Reference.Generated-Proxy-Classes-Web-Service-Methods.ashx)和[Callbacks]( http://www.asp.net/ajaxlibrary/Reference.Generated-Proxy-Classes-Succeeded-Callback-Function.ashx)。仔細檢查你是否正確傳遞了lineNumber。 – DNR 2011-04-01 16:30:55

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 <中模擬Function.prototype.bind 9.我建議使用_.bind進行仿真。

您可以使用$.proxy(row, loadOperators_Callback)

相關問題