asp: ImageButton не запускает событие onclick - PullRequest
9 голосов
/ 25 апреля 2009

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

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

Код-за:

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

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

Ответы [ 16 ]

0 голосов
/ 17 сентября 2009

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

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

0 голосов
/ 24 июля 2009

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

Вам даже нужно присвоить идентификаторы? - Конечно, это сделано для вас в любом случае? - Истинное удаление 'ib.ID = i + ":" + j;'

0 голосов
/ 02 июня 2009

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

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 = ...' закомментирована, они делают! Это единственное чередование, кажется, решает все проблемы. Понятия не имею почему. Если кто-то может объяснить это, а также сказать мне, как вызывать события, сохраняя возможность устанавливать идентификаторы кнопок, я был бы очень благодарен

0 голосов
/ 25 апреля 2009

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

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

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

0 голосов
/ 25 апреля 2009

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

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

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

0 голосов
/ 25 апреля 2009

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

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

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

<script runat=server>

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

        };
        base.OnInit(e);
    }

</script>

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

...