我有一个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"]
没有返回任何内容。我知道我必须在这里遗漏一些简单的东西,但我不确定是什么。
非常感谢任何帮助。
答案 0 :(得分:1)
应用程序页面的母版页在服务器端控件前放置一个前缀,以便它们是唯一的。如果您最终通过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]