2009-04-25 3 views
9

У меня есть страница, на которой используется главная страница, несколько RequiredFieldValidators и расширитель автозаполнения Web Toolkit. Следующий код показывает только голый минимум страницы:asp: ImageButton not firing onclick event

<%@ Page Language="C#" 
    AutoEventWireup="true" 
    CodeFile="Login.aspx.cs" 
    MasterPageFile="~/master.master" 
    Inherits="Login" %> 

<asp:Content id="Content1" 
    contentplaceholderid="ContentPlaceHolder1" 
    runat="server"> 
    <asp:UpdatePanel ID="pnlUpdate" runat="server"> 
     <ContentTemplate> 
      <div> 
       <asp:ImageButton class="submitButton" 
        imageurl="images/button_submit.gif" 
        id="btnSubmit" 
        runat="server" 
        onclick="btnSubmit_ServerClick"/> 
      </div> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
</asp:Content> 

Code-за:

protected void btnSubmit_ServerClick 
     (object sender, ImageClickEventArgs e) 
{ 
    //breakpoint here does not get hit 
} 

<form runat="server"> тег в главной странице. Приведенный выше код не запускает событие onclick. Если я избавлюсь от главной страницы и добавлю тег формы на страницу, она будет работать. Не поддерживается ли тег формы на главной странице или это должно работать как-то? alt text http://digitalcopy.warnerbros.com/images/mainmenu.gif?provider=00079&disc=03403AAA-1D20-47F2-91FA-5EE632832659

+0

Единственный ответ, который работал для меня был из другого вопроса. :) http://stackoverflow.com/a/15911261/1603799 – MiniRagnarok

ответ

0

У вас должен быть элемент управления в виде runat = server где-то, он может находиться на главной странице или в файле .aspx. Дважды проверьте, что тег главной страницы - runat = server

AutoEventWireup - это свойство, которое позволяет использовать синтаксис. Дважды проверьте настройки на главной странице, WebForm, и ее также можно установить в файле web.config.

если то не работает, вы всегда можете explicilty код он (который я предпочитаю)

<script runat=server> 

protected override void OnInit(EventArgs e) 
    { 
     btnSubmit.Click += delegate(object sender, EventArgs e1) 
     { 

     }; 
     base.OnInit(e); 
    } 

</script> 

UpdatePanel могут связываться с на стороне сервера событий поднимается также, поэтому попробовать его без UpdatePanel. И я уверен, что у вас есть ScriptManager в Master Page

+0

На главной странице также есть AutoEventWireup = true, а web.config не переопределяет его. Облом. – cdonner

+0

Я переместил тег формы (и диспетчер сценариев) из главной страницы и на страницу содержимого. Событие срабатывает сейчас, и у меня все еще есть главная страница. Не идеально, но достаточно обходного пути. – cdonner

+0

Если у вас есть UpdatePanel на главной странице, попробуйте удалить его –

0

Из кода, который вы предоставили, вам кажется, что на вашей странице отсутствует <asp:scriptmanager>. Вы должны выполнить одно из следующих действий:

  1. Иметь <asp:scriptmanagerproxy> на странице и <asp:scriptmanager> на главной странице.
  2. У вас есть <asp:scriptmanager> на вашей странице и не <asp:scriptmanager> на главной странице.

Лично я рекомендую иметь тег <form> на главной странице, но это личное предпочтение.

+0

Отличный пункт. Однако добавление scriptmanagerproxy не помогло. Я вернул форму на мастер и сохранил сценариста на странице содержимого, что также не сработало. Он работает только в том случае, если оба тега и теги scriptmanager находятся на странице содержимого. Weird. – cdonner

0

Вы всегда можете попробовать взять UpdatePanel и посмотреть, работает ли он. Обычно я начинаю без UpdatePanel, получаю все, что нужно, а затем добавляю в UpdatePanel и отлаживаю все, что вызывает.

Форма в MasterPage работает для меня, поэтому ScriptManager/ScriptManagerProxy, упомянутый @Keltex, может быть проблемой, хотя я иногда их забываю и обычно ухожу с нее.

С помощью UpdatePanel событие нажатия кнопки будет обрабатываться через Javascript, чтобы вы могли захватить FireBug или эквивалент (в зависимости от браузера) и следить за тем, что происходит на самом деле. Это срабатывает при проверке, и вы этого не видите? Есть ли ошибка JS где-то (Инструмент управления не всегда идеален)? Действительно ли страница вообще отправляется назад и просто не ударяет обработчика событий?

+0

Я стрелял по JS и видел обработанное событие, и никаких исключений не возникало. Почему он не получает отправки на сервер, для меня не было очевидным. Я должен был бы углубиться в сгенерированный клиентский код, чтобы понять его. Извлечение UpdatePanel не изменило поведение. – cdonner

+0

Что произойдет, если вы поменяете обычную кнопку для кнопки изображения? Это работает? Ведет ли он себя одинаково во всех браузерах? – Jared

+0

Внимательно прочитайте свой комментарий, это похоже на вопрос валидатора/JS, поскольку он не возвращает его на сервер. Есть ли у вас какие-либо другие элементы управления, такие как элементы управления Control Toolkit, которые могут помешать работе с кнопкой Image? – Jared

11

Вы также можете проверить, не активирует ли ваш ImageButton проверку. Если он устанавливает свойство CausesValidation в false (конечно, если это имеет смысл).

+0

Он запускает проверку, потому что он отлично работает с обходным решением на месте. – cdonner

0

На моей веб-странице я создаю динамические кнопки изображения внутри таблицы, которая содержится в панели обновления.Кнопки, созданные этот код:

for (int i = 0; i < 15; i++) 
    { 
     TableRow tr = new TableRow(); 
     for (int j = 0; j < 20; j++) 
     { 
      TableCell tc = new TableCell(); 
      ImageButton ib = new ImageButton(); 
      ib.Click += new ImageClickEventHandler(ImageButton1_Click); 
      ib.ImageUrl = "../img/defaultCell.jpg"; 
      ib.ID = i + ":" + j; 
      tc.Controls.Add(ib); 
      tc.Width = 25; 
      tc.Height = 25; 
      tr.Cells.Add(tc); 
     } 
     GameTable.Rows.Add(tr); 
    } 

}

Кнопка изображения не будет вызывать событие нажатия. ОДНАКО, если строка «ib.ID = ...» закомментирована, они это делают! Кажется, что это одиночное чередование устраняет все проблемы. Я понятия не имею, почему. Если кто-нибудь может это объяснить, а также рассказать мне, как инициировать события, сохраняющие возможность устанавливать идентификаторы кнопок, я был бы очень благодарен

+3

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

0

Я думаю, что это может иметь какое-то отношение к тому факту, что вы повторно назначили id после создания & назначения обработчика событий?

Вам даже нужно назначить идентификаторы? - Неужели это для вас все равно? - Истинное удаление «ib.ID = i +»: «+ j;»

3

У меня была аналогичная проблема (по другому сценарию). Я использовал Page.RegisterRequiresRaiseEvent(ImageButton), и мое событие onclick начало срабатывать. Зачем мне это нужно? Я не знаю.

2

У меня есть аналогичная проблема с кнопкой изображения и найдена основная причина. Вы используете

«ib.ID = i + ":" + j;»

как идентификатор ImageButton, то «:» незаконно имя использовать, как вы создаете его программно, ASP.NET позволяет создать.

Во время выполнения, если вы посмотрите на источник HTML-страницы, вы увидите, что специальные символы либо игнорируются, либо заменяются «_». Таким образом, страница не может найти правильный элемент управления, поэтому событие не будет срабатывать. Попробуйте изменить имя с помощью обычного текста, событие будет срабатывать.

0

Убедитесь, что вы используете OnClick вместо OnClick

Ваша панель обновления может быть баловаться с постбэка. Попробуйте это без UpdatePanel и посмотрите, является ли это виновником.

2

ib.ID = i + ":" + j;

должен быть изменен на

ib.ID = i.toString()+":"+j.toString(); 

Если он все еще не работает, попробуйте сделать использование StringBuilder для наращивания идентификатора и назначить его позднее ib.ID собственности

0

У меня была та же проблема, что и OnClick событие ImageButton не срабатывало. Но фактическая проблема заключалась в том, что на уровне формы у меня было onSubmit="return false;"

3

Моим решением было установить для параметра ImageButton CausesValidation значение false.

+0

Спасибо, что это тоже блокировало мое мероприятие – JsonStatham

0

Я столкнулся с той же проблемой, где я динамически создавал ImageButton, и щелчок этого события не запускался. следовательно, я создал кнопку Image в if (IsPostBack). Теперь он работает нормально. И даже если страница обновится, ImageButton будет сохранен.

0

Я только что решил аналогичную проблему, в которой включен OutputCache. При изменении с asp:ImageButton на asp:Button мероприятие будет правильно запущено. Вероятно, asp:ImageButton имеет некоторую ошибку с OutputCache.

0

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

0

Это решение, которое работает для меня

Если вы связывании через данные связанных управления затем использовать OnCommand атр вместо OnClick атр