Sharepoint Webpart通过PostBackUrl将数据发布到应用程序页面

时间:2011-09-05 22:26:51

标签: c# sharepoint web-parts applicationpage

我有一个Webpart,在更新面板上包含几个下拉列表。有一个提交按钮,其PostBackUrl设置为sharepoint Application Page

<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" />

这可以将浏览器重定向到我创建的应用程序页面,但是我无法访问表单数据。

在Application Page的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"]

没有返回任何内容。我知道我必须在这里遗漏一些简单的东西,但我不确定是什么。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

啊,ASP.NET主页前缀问题!我的最爱之一。

应用程序页面的母版页在服务器端控件前放置一个前缀,以便它们是唯一的。如果您最终通过Form集合访问您的控件,则必须不仅使用控件ID而且还使用ContentPlaceholder前缀来访问它。这就是为什么你看到从你的调试逻辑中抛出这么大的ID。

如果要以编程方式获取控件的ID,可以使用FindControl,但是您必须为此定位适当的内容占位符范围。这是一个很好的教程/解释here(这真的强调了它的复杂程度!)。

当然,您可以使用的另一个选项是根据您从调试代码中看到的内容对控件ID进行硬编码...但如果您更改内容占位符或更多控件,那么这将不可靠到另一个容器。

我想答案取决于你的控件的静态程度。

希望这会有所帮助。祝你好运!!

答案 1 :(得分:0)

以这种方式访问​​它你必须使用

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

您可以从代码中实际看到将标签文本设置为s加Request.Form[s]

的位置