2009-08-24 3 views
18

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

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

Мой повторитель выглядит следующим образом:

<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> 

и мой CodeBehind так:

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

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

+0

Покажите нам полный код вашей страницы (разметка и бэкэнд), если это возможно. – Bdiem

+0

Полная разметка не помещается в поле комментариев, но на этой странице нет ничего необычного. Использование мастер-страниц (без ссылки на ViewState на основных страницах) и Content Placeholders, а затем на ретранслятор - очень просто. У кода сзади есть еще один код доступа к базе данных/репозитория, но опять же ничего необычного –

+0

У вас есть вид на гость включен для этой страницы? –

ответ

22

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

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

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

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

Edit: Обходной описано здесь: http://petesdotnet.blogspot.dk/2009/08/asp.html

+0

+1, в прошлом у меня была такая же проблема с viewstate. (Я хотел бы знать ваш рабочий стол) – Cleiton

+0

+1 это имеет гораздо больший смысл. возможно, добавьте это в свой ответ. http://msdn.microsoft.com/en-us/library/ms972976.aspx – Bdiem

+0

Нет, ViewState включен (я все равно не отключил его в приложении) –

0

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

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

+0

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

0

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

+0

Не совсем. В событии Init: «Если текущим запросом является обратная передача, данные обратной передачи еще не загружены, а значения свойств управления не были возвращены в значения из состояния просмотра». См. Http://msdn.microsoft.com/en-us/library/ms178472.aspx – Venemo

0

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

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

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

+0

Как вы можете видеть из моего исходного кода выше, я уже использовал событие ItemCommand с CommandArgument и CommandName –

+0

Я обновил свой ответ для уточнения. :) – Venemo

6

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

1

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

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

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

</asp:LinkButton> 

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

весело :)

1

Я удалил PostBackUrl недвижимость в LinkButton и ItemCommand увольняют. Я думаю, что postback работает первым.

0

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

+0

Добро пожаловать в переполнение стека. Это не очень хороший ответ. См. [Как написать хороший ответ на вопрос?] (Http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good-answer-to-a-question) – hims056

0

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

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

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

0

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

1

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

3

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

+0

точно, что я отсутствовал.thankx – mzonerz

0

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

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

protected void Page_Load(object sender, EventArgs e) 
{ 

} 


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

теперь вы можете запустить свой Itemcommand..if вы получаете выход Пожалуйста, отметьте ответ, как правое спасибо

0

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

Смежные вопросы