2011-11-11 86 views
4

在後的DropDownList不回發,即使設定的AutoPostBack

使用asp.net頁面用C#代碼隱藏的結束暗紋的解決方案,我已經成功地構建和填充一個DropDownList。

我想要做的是捕獲從下拉列表中選擇的新值(最好使用回發到我的代碼隱藏)。然後代碼隱藏可以根據這個新選擇的下拉列表值更新頁面上的其他內容。

我第一次嘗試是使用

<asp:DropDownList ID="myDDL" runat="server" AutoPostBack="true" OnSelectedIndexChanged="foo"></asp:DropDownList> 

與C#方法

public void foo(object sender, EventArgs e) 
{ 
    DropDownList ddl = sender as DropDownList; 
    string myValue = ""; 

    if (ddl != null) 
    { 
     myValue = ddl.SelectedValue; 
     // Do some stuff 
    } 
} 

這沒有奏效。當選定的索引被更改後,它只是重新加載頁面,但IsPostBack標誌始終爲false。

所以我通過SO篩選並嘗試了許多不同的策略。最近,我嘗試在代碼隱藏中註冊客戶端onChange事件,並關閉AutoPostBack。

在ASP.Net頁面

<asp:DropDownList ID="myDDL" runat="server" AutoPostBack="false"></asp:DropDownList> 
在代碼隱藏

myDDL.Attributes.Add("onChange", "doSomeStuff(this);"); // Done on databind. 

我增加了客戶端JavaScript調用網頁的__doPostBack功能

<script language="javascript" type="text/javascript"> 
    function doSomeStuff(ddl) { 
     var ddlVals = document.getElementById(ddl.id); 

     __doPostBack(ddlVals, ''); 
    } 
</script> 

這也失敗了,雖然我認爲這是去某個地方,當我看到JavaScript正常執行。

但是,在代碼隱藏中,它仍然無法正常工作。當我在Page_Load中放置斷點時IsPostBack爲false!但它應該是一個回傳!?它使用__doPostBack和(單獨地)自動地使用AutoPostBack =「true」來發布回去

所以我挖得更深。

根據此MSDN文章(http://msdn.microsoft.com/en-us/library/ms178141(v=VS.85).aspx)根據頁面加載結果我做了一個「服務器傳輸」而不是所需的回傳(IsPostBack爲false,正如預期的那樣,PreviousPage是應回發的同一頁面,IsCallback爲false,IsCrossPagePosting爲false)。

可能會發生什麼事情來劫持AutoPostBack和__doPostBack,使其看起來像「服務器轉移」一樣?

我可以設置/檢查父控制 /頁面以確保它允許回傳?

編輯:

在Page_Load看起來是這樣的:在//set some variables頁面

private SpecialDataObject _someData; 
private string foobar; 
public void Page_Load(object sender, EventArgs e) 
{ 
    //set some variables. 
    this.foobar = "blah"; 

    LoadSomeUnrelatedData(); 

    if (!IsPostBack) 
    { 
     if (_someData == null) 
     { 
      LoadDataWithoutBinding(); 
     } 
     BindMyData(); 
    } 
} 

具有斷點。即使在AutoPostBack之後,IsPostBack始終爲false。

編輯2:

答案是在服務器轉移。在從母版頁加載的遠程控件中,該URL會在它到達頁面之前被檢查並重新路由,這有效地否定了我的回發。之前我沒有看到它,因爲我只在目標頁面中添加了斷點。

+0

我們可能需要查看Page_Load的有限形式,以幫助您瞭解正在發生的事情。 –

+0

我在page_load大綱中添加了@jmein。 BindMyData成功綁定數據。 – Peach

回答

4

我會檢查以確保你沒有驗證干擾回發的地方。要檢查這一點,請在DropDownList上將CausesValidation設置爲false。

3

您是否重置PageLoad中的下拉列表的值?

此外,您可能還想考慮使用UpdatePanel,以便它不會重新加載整個頁面。

+0

是的,它被重新綁定在page_load上,但僅僅是因爲它在回覆後沒有將IsPostBack設置爲true。如果IsPostBack設置爲true,我可以避免重置下拉列表...對我來說就像一個Catch-22。此外,關於UpdatePanel的好處,但是我有一些實際的頁面邏輯被執行,所以在這種情況下,UpdatePanel不適合我。 – Peach

+0

@Peach這很奇怪,應該將IsPostBack設置爲true。但是,即使您擁有如此複雜的頁面邏輯,您仍然可以使用UpdatePanel。之前我已經做了好幾次,它使頁面更加用戶友好。 –

0

它是否在UpdatePanel中?如果是,請設置ChildrenAsTriggers =「true」

+0

不,它不是。 UpdatePanel在我的特定情況下並不合適,雖然在一般情況下可能會有用。 – Peach

0

根據您提及的嘗試,以及關於更新面板的意見,我嘗試了幾件事情。

通過設定的負載事件中的數據源,你只會做一次:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     //set up data here 
    } 
} 

您可以使用Page.IsPostBack代碼和你的方法來得到你想要的東西:

if (Page.IsPostBack) 
{ 
    //do page reload logic in here 
} 

protected void foo(object sender, EventArgs e) 
{ 
    //get your selected value here 
} 

(注:兩個回傳條件句在頁面加載事件)

編輯:

這裏的整個設置,它的基本的,但你的想法:

enter image description here

正如你可以看到,當我從貓到狗做了一個選擇,但它認識到有一個回傳,所以它跳過了數據綁定和設置。我只能假設在這裏還有別的東西,我沒有看到如果你不能在回發中讓它迴歸真實。

+0

不知道我跟着你。通過「加載事件」你的意思是Page_Load或其他東西?如果page_load,我已經在綁定數據源之前檢查了IsPostBack,但IsPostBack總是假的,所以它總是被反彈...... – Peach

+0

我爲你發佈了SS /澄清。 – KreepN

+0

對,不幸的是,'別的'我不明白:) – Peach

相關問題