1

我有一个 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"]

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

任何帮助是极大的赞赏。

4

2 回答 2

1

啊,ASP.NET母版页前缀问题!我最喜欢的之一。

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

如果您想以编程方式获取控件的 ID,您可以使用FindControl,但您必须为此指定适当的内容占位符范围。Here's a good tutorial/explanation here(它真正强调了这会变得多么复杂!)。

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

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

希望这可以帮助。祝你好运!!

于 2011-09-05T23:30:43.407 回答
0

那么以这种方式访问​​它,你将不得不使用

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

正如您从代码中实际看到的那样,您将标签文本设置为 s plusRequest.Form[s]

于 2011-09-05T22:59:19.667 回答