Sharepoint Webpart размещает данные на странице приложения через PostBackUrl
У меня есть веб-часть, которая содержит несколько выпадающих на панели обновления. Есть кнопка отправки, для которой 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" />
Это работает при перенаправлении браузера на страницу приложения, которую я создал, но у меня возникают проблемы с доступом к данным формы.
На функции 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 ответа
Ах, проблема префикса главной страницы ASP.NET! Один из моих любимых.
Главная страница страницы вашего приложения ставит префикс перед элементами управления на стороне сервера, чтобы они были уникальными. Если вы в конечном итоге получить доступ к управлению через Form
коллекция, вы должны получить к нему доступ не только по идентификатору элемента управления, но и по префиксу ContentPlaceholder. Вот почему вы видите такой большой идентификатор, выброшенный из вашей логики отладки.
Если вы хотите программно добраться до идентификатора элемента управления, вы можете использовать FindControl
, но для этого вам нужно настроить таргетинг соответствующей области содержимого. Вот хорошее руководство / объяснение здесь (которое действительно подчеркивает, насколько сложным это может быть!).
Конечно, другой вариант, который вы можете использовать, - это просто жесткое кодирование идентификатора элемента управления на основе того, что вы видите в своем коде отладки... но это не будет надежным, если вы измените заполнители содержимого или более свой элемент управления на другой контейнер.
Я думаю, ответ зависит от того, насколько статичными будут ваши элементы управления.
Надеюсь это поможет. Удачи!!
Ну, чтобы получить к нему доступ таким образом, вы должны использовать
Page.Request.Form["ctl00$m$g_24a73cf8_8190_4ddb_b38b_bf523b12dbd3$ctl00$ClassSelector"]
Как вы можете видеть из своего кода, где вы устанавливаете текст метки на плюс Request.Form[s]