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]

Другие вопросы по тегам