在後的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會在它到達頁面之前被檢查並重新路由,這有效地否定了我的回發。之前我沒有看到它,因爲我只在目標頁面中添加了斷點。
我們可能需要查看Page_Load的有限形式,以幫助您瞭解正在發生的事情。 –
我在page_load大綱中添加了@jmein。 BindMyData成功綁定數據。 – Peach