Команда ретранслятора ASP.Net не уволена - PullRequest
20 голосов
/ 24 августа 2009

Хорошо, я использовал репитеры буквально сотни раз без проблем, но сегодня что-то пошло не так. У меня есть повторитель, и я подписываюсь на событие itemCommand, но когда моя команда запускается, страница отправляется обратно, но событие не запускается.

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

Мой ретранслятор выглядит так:

<asp:Repeater id="MyRepeater" runat="server" onitemcommand="MyRepeater_ItemCommand">
<ItemTemplate>
    <li>
    <asp:Label id="Label" runat="server" />
    <asp:LinkButton id="LinkButton1" runat="server" commandname="Complete" commandargument='<%# Eval("MyID") %>' text='<%# Eval("Title") %>' />
    </li>
</ItemTemplate>
</asp:Repeater>

и мой код за вот так:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
    SetupPage();
    }
}

private void SetupPage()
{
    // Do other stuff

    MyRepeater.DataSource = Repository.GetStuff()
    MyRepeater.DataBind();
}


protected void MyRepeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{


// Do all my stuff here
}

MyRepeater_ItemCommand не вызывается, если я не закомментирую строку if (! IsPostBack). Как только это закомментировано, и повторитель получает данные для каждой обратной передачи, он работает нормально. Я делал это на многих других страницах, но на этом он просто не работает.

Кто-нибудь еще сталкивался с таким поведением или есть решение?

Ответы [ 12 ]

23 голосов
/ 24 августа 2009

Скорее всего, вы отключили ViewState для страницы.

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

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

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

Редактировать: Обходной путь описан здесь: http://petesdotnet.blogspot.dk/2009/08/asp.html

6 голосов
/ 22 ноября 2011

Удалить if (!IsPostBack), так как это препятствует повторному связыванию повторителя, и событие команды item не может найти строку после обратной передачи.

4 голосов
/ 13 ноября 2015

У меня та же проблема, и кроме использования панели обновления, в моем модале есть обязательный валидатор полей. Я обнаружил, что LinkButtons в моем повторителе вызывает событие requiredFieldValidor, а затем я добавил CausesValidation = "false" в LinkButtons моего повторителя. Работает как положено.

2 голосов
/ 16 февраля 2012

У меня эта проблема в повторителе, когда я использую ImageButton ... У меня есть поиск в сети для этого решения, когда LinkButton работает, но не ImageButton ...

Тогда я думаю, LinkButton работает? поэтому я буду использовать его:)

<asp:LinkButton  CommandName="Filter" CommandArgument='<%# Eval("ID") %>' Text="" runat="server" >
<asp:image imageurl='<%#Eval("Img") %>' runat="server"/>

</asp:LinkButton> 

Итак, изображение находится внутри тега <A>

веселись :) 1009 *

1 голос
/ 24 апреля 2014

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

1 голос
/ 07 марта 2014

Возможно, вы установили валидацию на своей странице. Так что установите новый атрибут причинения = «ложь» для кнопки «Ссылка». M уверен, что это решит проблему

1 голос
/ 22 июня 2012

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

0 голосов
/ 01 декабря 2016

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

0 голосов
/ 05 марта 2016

Вот код, который вы должны использовать в коде позади ..

после события PageLoad,

 protected void Page_Load(object sender, EventArgs e)
 {

 }


 protected void Page_LoadComplete(object sender, EventArgs e)
 {
      // Bind Your Repeater here
      rptUser();
 }

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

0 голосов
/ 30 октября 2012

Попробуйте это:

protected void Page_Load(object sender, EventArgs e)
{
    SetupPage();
}

Если вы используете вложенный ретранслятор, вам следует привязать свой внутренний репет

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