2011-09-05 97 views
1

我有一個Webpart在更新面板上包含幾個下拉列表。有一個提交按鈕,有一項PostBackUrl設置爲SharePoint應用程序頁面Sharepoint Webpart通過PostBackUrl發佈數據到應用程序頁面

<asp:DropDownList ID="ClassSelector" runat="server" Enabled="False" 
    AutoPostBack="True" onselectedindexchanged="ClassSelector_SelectedIndexChanged"> 
    <asp:ListItem Selected="True" Value="-null-">Select Class...</asp:ListItem> 
    <asp:ListItem Value="1">Class 1</asp:ListItem> 
</asp:DropDownList> 
<asp:Button ID="btnSubmit" runat="server" Text="Show Page" Enabled="False" 
       PostBackUrl="~/_layouts/MyWebParts/MyAppPage.aspx" /> 

這個作品在重定向瀏覽器中我所創建的應用程序頁面,但我無法訪問表單數據。

在應用程序頁面的Page_Load函數中,我有以下調試代碼。

protected void Page_Load(object sender, EventArgs e) 
{ 
    Label1.Text = ""; 

    foreach (String s in Page.Request.Form.AllKeys) 
    { 
     Label1.Text += s + ": " + Page.Request.Form[s] + "<br />"; 
    } 

} 

這表明我需要的數據實際上已經發布到頁面。

ctl00$m$g_24a73cf8_8190_4ddb_b38b_bf523b12dbd3$ctl00$SemesterSelector: 28 
ctl00$m$g_24a73cf8_8190_4ddb_b38b_bf523b12dbd3$ctl00$ClassSelector: 11-0021-A 

但是當我嘗試訪問此爲:返回

Page.Request.Form["ClassSelector"] 

沒有。我知道我必須在這裏錯過簡單的東西,但我不確定是什麼。

任何幫助是極大的讚賞。

回答

1

啊,看到ASP.NET主頁面前綴問題!我最喜歡的之一。

您的應用程序頁面的母版頁在您的服務器端控件的前面放置一個前綴,以使它們具有唯一性。如果您最終通過Form集合訪問您的控件,則不僅需要使用控件ID,還需要使用ContentPlaceholder前綴來訪問它。這就是爲什麼你看到這樣一個大的ID從調試邏輯中轉出來的原因。

如果要以編程方式獲取控件的ID,則可以使用FindControl,但您必須將適當的內容佔位符範圍作爲目標。這裏有一個很好的教程/解釋here(這真的強調這可以得到多麼複雜!)。

當然,您可以使用的另一個選項是根據您從調試代碼中看到的內容對控件ID進行硬編碼......但如果您更改了內容佔位符或更多內容控制到不同的容器。

我想答案取決於你的控件將如何靜態。

希望這會有所幫助。祝你好運!!

0

那麼訪問它的方式,你將不得不使用

Page.Request.Form["ctl00$m$g_24a73cf8_8190_4ddb_b38b_bf523b12dbd3$ctl00$ClassSelector"] 

正如你實際上可以從你的代碼中設置標籤文本送加Request.Form[s]

+0

這不會工作,因爲id會改變。我將我的解決方案部署到另一個SharePoint服務器,並得到以下響應。 ctl00 $ M $ $ g_c690a07a_e525_4c4d_9c98_efb436828ec7 $ ctl00 SemesterSelector:28 ctl00 $ M $ $ g_c690a07a_e525_4c4d_9c98_efb436828ec7 $ ctl00 ClassSelector:11-0021-A – Littlejon

相關問題