2011-09-05 79 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