簡體   English   中英

從客戶端填充下拉列表的SelectedIndexChanged事件不會觸發

[英]Dropdown's SelectedIndexChanged event is not fired when its populated from client side

我的網頁上有一個下拉菜單,該菜單是從客戶端JavaScript代碼填充的。 SelectedIndexChanged不會觸發。 但是,當我從代碼隱藏(.cs文件)填充下拉列表時,將觸發偶數。

從后面的代碼填充下拉列表時,如何處理SelectedIndexChanged任何想法。 我可以看到下拉列表正在根據我的需求進行填充。 只有SelectedIndexChanged甚至不會被解雇。 還要注意,下拉菜單位於UpdatePanel內部。 那會是一個原因嗎?

這是事件背后的html,javascript和代碼:

<asp:DropDownList ID="ddS" runat="server" OnSelectedIndexChanged="ddS_SelectedIndexChanged"
                AutoPostBack="True" Style="position: absolute; width: 50%;">

使用Javascript:

$('#ddS').append('<option value="' + $(this).val() + '">' + $(this).text() + '</option>');

CS

protected void ddS_SelectedIndexChanged(object sender, EventArgs e)
{
}

任何幫助,將不勝感激。 提前致謝。

編輯我這樣做的主要原因是:我使用了jquery ui js進行彈出,它具有多選下拉列表。 由於彈出窗口中的按鈕無法發生服務器端事件,因此我已使用ajax調用.cs文件中的Web方法。 此方法將使用在多選下拉列表中選擇的選項來更新數據庫中的表。 完成后,我要基於多選中選擇的選項關閉彈出窗口並填充一個下拉列表。

我無法從后面的代碼中填充下拉列表,因為Web方法是靜態方法,因此從該方法調用的任何方法都必須是靜態方法。 如果我編寫靜態方法,則無法從靜態方法訪問UI控件(下拉菜單)。 所以我希望可以從JS中填充它,然后觸發我的indexchange事件以進行進一步的計算。

簡短的答案是不要這樣做。 這不是設計ASP.NET Server控件的工作方式,最終您將創建一個Rube Goldburg使其正常工作。 詳情如下:

ASP.NET具有內置的安全功能(事件驗證),以防止發布頁面生命周期的“渲染”階段之后控件中不存在的數據。 如果發生這種情況,將引發ArgumentException。 您可以禁用事件驗證或重寫Render,並在Page_Load函數中粘貼大量代碼,但我不建議這樣做。

那么,為什么所有這些事情都會發生呢? ASP.NET Server控件使用ViewState來嘗試創建類似於桌面應用程序中的狀態的狀態(Windows窗體=> Web窗體查看其在其中所做的工作)。 如果ViewState不了解您添加到<select><options>則會感到不高興。 一些解決方案是:

1)在服務器端填充DropDownList(除非您有很好的理由不這樣做),然后讓ASP.NET Framework進行預期的操作(您可能還必須將EnableViewState = true屬性添加到DropDownList控制,盡管我相信它是默認設置)。 如果DropDownList在更新面板中,則ViewState是由面板觸發的PartialPostBack更新的,因此ViewState在獲得無閃爍更新時會保持快樂狀態。

2)忘記服務器端代碼,並使用JavaScript創建並填充<select>控件。

a)您可以綁定JavaScript事件偵聽器,以在更改所選項目時更新隱藏字段。 然后在PostBack上,您可以讀取隱藏字段的值以獲取最后選擇的項目的值。

b)如果您需要將更改與服務器端代碼進行通信,則當選擇更改時,可以綁定JavaScript事件偵聽器以運行POST或GET(AJAX請求)。 你從來沒有真正說過你的目標是...

在問題更新后進行編輯:

我可以想到三種方式:

1)刪除ASP DropDownList控件,並使其成為常規的HTML select控件。 為控件命名(使用name屬性而不僅僅是id屬性)。 例如:

<select name='options'></select>

在POST上,HttpContext.Current.Request.Form是一個NameValueCollection,它將包含POSTed數據的鍵-值對。 你應該能夠通過你給的名字從你的選擇控制所選擇的項目select控制:

var options = HttpContent.Current.Request.Form["options"].Split(',');

現在,選項將是所選值的列表。 如果您需要啟用AJAX(不刷新頁面),請將其包裝在UpdatePanel

2)在POST上將所選項目寫入隱藏字段,並從隱藏字段中收集值。

3)觸發POST到Web方法,該方法將更新會話對象,然后可以從類成員/方法后面的非靜態代碼內部讀取該對象。 Web Method裝飾有一個可選屬性,用於啟用會話:

[WebMethod(EnableSession = true)]

通常,您需要確保在所有DOM操作之后都設置了事件處理程序(您的SelectedIndexChanged)。 在您的情況下,您可以通過jQuery的append方法來添加html元素。 不幸的是,無法向該方法添加回調。 但是,帶有計時器“ 1ms”的settimeout始終會將函數置於settimeout中,該值位於調用堆棧的底部。

$('#ddS').append('<option value="' + $(this).val() + '">' + $(this).text() + '</option>');
setTimeout(function() {
  // set listener here
  // e.g. $("#ddS option").change(function(){ 
  //   ddS_SelectedIndexChanged()
  // });
}, 1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM