События ASP .NET Web User Control - PullRequest
0 голосов
/ 24 июня 2010

Я создал пользовательский веб-элемент управления с именем Activity. Я определил общедоступное событие в этом пользовательском веб-элементе управления под названием OnActivityDelete. В элементе управления «Активность» есть кнопка удаления. При нажатии кнопки удаления элемент управления «Активность» запускает событие OnActivityDelete. Я использую этот пользовательский веб-элемент управления в репитере. Я назначаю обработчик события для события OnActivityDelete в событии, связанном с данными элемента репитера. Когда я нажимаю кнопку удаления для элемента управления «Активность», событие запускается из элемента управления «Активность», но оно никогда не попадает в обработчик событий на странице, которая использует элемент управления. (Я вошел в код с помощью отладчика и подтвердил это поведение).

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

Можно ли определить обработчик событий для элемента управления Activity в разметке страницы aspx? Если так, это решит мою проблему?

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

Разметка повторителя на странице:

<asp:Repeater ID="rptrActivites" runat="server" EnableViewState="true">
  <ItemTemplate>
    <div class="activity">
      <crm:Activity ID="activityView" runat="server" Activity="<%#Container.DataItem %>" EnableViewState="true" />
    </div>
  </ItemTemplate>
</asp:Repeater>

Код страницы:

  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    If Not Page.IsPostBack Then
      GetActivities()
    End If

  End Sub

  Private Sub GetActivities()

    Dim oDS As DataSet

    'Code removed for brevity'

    rptrActivites.DataSource = oDataView
    rptrActivites.DataBind()

  End Sub

  Private Sub rptrActivites_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptrActivites.ItemDataBound

    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
      Dim activityView As Activity = e.Item.FindControl("activityView")
      If activityView IsNot Nothing Then
        AddHandler activityView.OnActivityDelete, AddressOf ActivityDelete
      End If
    End If

  End Sub

  Private Sub ActivityDelete(ByVal sender As Object, ByVal e As ActivityDeleteEventArgs)
    'This never fires'
  End Sub

Разметка элемента управления «Активность»:

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="Activity.ascx.vb" Inherits=".Activity" %>
<!-- code removed for brevity's sake -->
<asp:LinkButton ID="btnDelete" runat="server" Text="Delete" />
<!-- code removed for brevity's sake -->

Код контроля активности:

Public Event OnActivityDelete(ByVal sender As Object, ByVal e As ActivityDeleteEventArgs)

Private Sub btnDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDelete.Click
  RaiseEvent OnActivityDelete(Me, New ActivityDeleteEventArgs())
End Sub

1 Ответ

1 голос
/ 24 июня 2010

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

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

Одна вещь, которую вы, возможно, захотите попробовать, это поместить ваш источник данных Repeaters в свойство viewstate / server.Таким образом, вам нужно только дорого извлечь данные, чтобы связать их один раз на! Page.IsPostBack, а затем последовательно перепривязывать повторитель при каждой загрузке страницы.Это должно позволить вашей странице идентифицировать исходный источник управления инициируемого события, присоединить его и затем обработать запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...