Запуск события из элемента управления ascx для обновления некоторых элементов управления в контейнере - PullRequest
0 голосов
/ 06 октября 2010

Я запускаю событие из элемента управления ascx, чтобы обновить некоторые элементы управления в контейнере, к которому принадлежит элемент управления ascx.

Элемент управления ascx отображается через модальный всплывающий расширитель. Когда я нажимаю кнопку внутри ascx, я запускаю событие, на которое подписывается контейнер, содержащий элемент управления ascx.

Делегат события срабатывает, и ожидаемая логика выполняется в коде контейнера, проблема в том, что любые изменения, внесенные в элементы управления внутри контейнера, не обновляются, несмотря на то, что логика события была обработана. Ожидаемые изменения не отражаются на странице при отображении результатов обратной передачи.

Есть ли какие-нибудь подводные камни, о которых я должен знать?

Разметка для контейнера

<asp:Panel ID="panelTreeViewAttributesTitle" runat="server">
<asp:Label ID="someLabel" runat="server" Text="Hello Governor" />
<asp:LinkButton ID="LinkButtonEdit" runat="server" Text="(Edit)" />
<ajax:ModalPopupExtender BackgroundCssClass="modalBackground" Enabled="True" 
     ID="btnEdit_ModalPopupExtender" PopupControlID="modalPanel" runat="server"
     TargetControlID="LinkButtonEdit" />
</asp:Panel>
<asp:Panel ID="modalPanel" runat="server" CssClass="modalPopUp" Style="display: none">
    <xxx:customControl runat="server" ID="myCustomControl" />
</asp:Panel>

Код для контейнера

protected void Page_Load(object sender, EventArgs e)
{
myCustomControl.Updated += eventCaptured;
if (IsPostBack) return;
...
}

void eventCaptured(object sender, EventArgs e)
{
someLabel.Text = "Goodbye Governor";
}

Пользовательский элемент управления

<script type="text/javascript">
function Update() {
    var ajaxManager = $find("<%= RadAjaxManager.GetCurrent(Page).ClientID %>");
    if (ajaxManager != null)
    ajaxManager.ajaxRequest("");
    }
</script>
<asp:Panel ID="panelEditPanel" runat="server">
    <asp:Label ID="lblCMA" runat="server" Text="Call me Arnooold." />
</asp:Panel>
<asp:Button ID="btnUpdate" runat="server" Text="Update" OnClientClick="Update()" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" />

Код пользовательского элемента управления, стоящий за

public event EventHandler Updated;

protected void AjaxManager_AjaxRequest(object sender, AjaxRequestEventArgs e)
{
    //Some DB backend logic
    UpdateFinished();
}

private void UpdateFinished()
{
    if (Updated == null) return;
    Updated(this, null);
}

1 Ответ

0 голосов
/ 10 октября 2010

Возможно, нажатие кнопки вызывает частичную публикацию назад вместо обычной публикации на всю страницу назад. Если это так, весь жизненный цикл будет выполняться на стороне сервера (включая ваш обработчик событий), но только часть HTML будет обновляться на стороне клиента, когда ответ возвращается в браузер. «someLabel» может находиться за пределами региона, который обновляется на стороне клиента.

...