Повторитель ASP.Net Элемент Команда не запускается

Хорошо, я использовал ретрансляторы буквально сотни раз без проблем, но сегодня что-то пошло не так. У меня есть ретранслятор, и я подписываюсь на событие 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). После того, как это прокомментировано, и ретранслятор получает привязку к каждой обратной почте, он работает нормально. Я сделал это во многих других страницах, но на этом он просто не работает.

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

Ответы

Ответ 1

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

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

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

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

Изменить: Обходное решение описано здесь: http://petesdotnet.blogspot.dk/2009/08/asp.html

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

</asp:LinkButton> 

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

получайте удовольствие:)

Ответ 5

Я удалил свойство PostBackUrl в linkbutton и ItemCommand. Я думаю, что postback работает первым.

Ответ 6

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

Ответ 7

Я не уверен в этом, но вам может потребоваться установить CommandName и необязательно CommandArgument для кнопки, вызывающей событие ItemCommand, В противном случае ASP.NET предположил бы, что на странице нет кнопки, которую вы хотели бы запустить. Вы можете попробовать это.

Кроме того, если вы не различаете имена команд, почему бы не использовать каждую кнопку вместо Click? Просто подпишитесь на те, что в репитере ItemCreated или ItemDataBound.

Ответ 8

Попробуйте использовать Page_init вместо Page_load, и это должно устранить проблему.

Ответ 9

Вот решение на переполнение стека: ссылка. Надеюсь, это поможет!

EDIT: Я заметил, что ваш Repeater подписывается на событие ItemCommand из разметки. Если я сделаю так, это не стреляет для меня!

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

Ответ 10

Проверьте привязку имени команды.

Ответ 11

Попробуйте следующее:

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

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

Ответ 12

Возможно, вы установили на своей странице проверки. Поэтому установите новый атрибут, causevaliation = "false" на ссылку. M уверен, что это решит проблему.

Ответ 13

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

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

 protected void Page_Load(object sender, EventArgs e)
 {

 }


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

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

Ответ 14

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