我有一个Webpart,在更新面板上包含两个下拉列表。有一个提交按钮,它的PostBackUrl设置为sharepoint应用程序页面
<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"]
不返回任何内容。我知道我一定错过了一些简单的东西,但我不确定是什么。
啊,ASP。. NET母版页前缀问题!我的最爱之一。
应用程序页面的母版页在服务器端控件前面放置了一个前缀,以便它们是唯一的。如果您最终通过Form
集合访问控件,则不仅要使用控件ID,还要使用ContentPlaceholder前缀来访问它。这就是为什么您会在调试逻辑中看到如此大的ID。
如果您想以编程方式获得控件的ID,您可以使用FindControl
,但是您必须为此瞄准适当的内容占位符范围。这里有一个很好的教程/解释(这真的强调了这有多复杂!)。
当然,你可以使用的另一个选项是根据你从调试代码中看到的内容硬编码控件id…但是,如果您更改内容占位符或将控件转移到其他容器中,那么这将不可靠。
我想答案取决于你的控制将是多么静态。
希望这对你有帮助。祝你好运! !
如果要访问它,你必须使用
Page.Request.Form["ctl00$m$g_24a73cf8_8190_4ddb_b38b_bf523b12dbd3$ctl00$ClassSelector"]
你可以从代码中看到你将标签文本设置为s + Request.Form[s]