none
PostBack выполняется, но событие не вызывается. RRS feed

  • Вопрос

  • Приветствую,
    У меня есть свой Custom-ный контрол, у которого есть событие Click-а:
    public class ItemSection : WebControl, IPostBackEventHandler
        {
    
    //... 
    
    public delegate void ItemSectionClickEventHandler(object sender, ItemSectionClickEventArgs e);
    
            public event ItemSectionClickEventHandler ItemSectionClick;
    
            public virtual void OnItemSectionClick(ItemSectionClickEventArgs e)
            {
                if (ItemSectionClick != null)
                {
                    ItemSectionClick(this, e);
                }
            }
    
            public void RaisePostBackEvent(string eventArgument)
            {
                string[] args = eventArgument.Split('$');
    
                OnItemSectionClick(new ItemSectionClickEventArgs(ulong.Parse(args[0]), args[1], args[2]));
            }
    }
    

    Для события также написан свой класс аргументов события:
    public class ItemSectionClickEventArgs : EventArgs
        {
            private ulong mItemId;
            private string mCommandName;
            private string mItemName;
    
    
            public ItemSectionClickEventArgs(ulong itemId, string commandName, string itemName)
            {
                mItemId = itemId;
                mItemName = itemName;
                mCommandName = commandName;
            }
    
            public ulong ItemId
            {
                get { return mItemId; }
            }
    
            public string CommandName
            {
                get { return mCommandName; }
            }
    
            public string ItemName
            {
                get { return mItemName; }
            }
        }
    

    событие должно срабатывать по кнопке этого контрола, это реализовано так:
    pbo.Argument = new StringBuilder(SectionId).Append("$change_section_properties$<new_section_name>").ToString();
    
                writer.AddAttribute(HtmlTextWriterAttribute.Onclick,
                    new StringBuilder("javascript:ChangeSectionProperties(this, \"")
                    .Append(Page.ClientScript.GetPostBackEventReference(pbo)).Append("\")").ToString());
    

    ну и наконец сам скрипт на клиенте, который вызывает PostBack:
    function ChangeSectionProperties(button, postBackReference) {
                var new_section_name = button.parentNode.parentNode.getElementsByTagName("input")[0].value;
    
                if (new_section_name == '') {
                    var message_dialog = $("#dialog_message").get(0);
    
                    message_dialog.getElementsByTagName("strong")[0].innerHTML = 'Новое имя раздела не может быть string.Empty!';
    
                    $(message_dialog).dialog('open');
                }
                else {
                    postBackReference = postBackReference.replace("<new_section_name>", new_section_name);
    
                    setTimeout(postBackReference, 0);
                }
            }
    

    Сам генерируемый PostBackReference:
    __doPostBack('ctl00$ctl00$ContentPlaceHolder1$chpPageContent$repeaterSections$ctl00$itemSection','1$change_section_properties$Первый раздел')
    
    обработчик события указан для контрола:
    <AlternatingItemTemplate>
                                <itemCtrl:ItemSection runat="server" ID="itemSection" SectionId='<%# Eval("Id") %>'
                                    SectionName='<%# Eval("Name") %>' onclick="itemSection_Click" />
                            </AlternatingItemTemplate>
                            <ItemTemplate>
                                <itemCtrl:itemSection runat="server" ID="itemSection" SectionId='<%# Eval("Id") %>'
                                    SectionName='<%# Eval("Name") %>' onclick="itemSection_Click" />
                            </ItemTemplate>
    

    Так вот скрипт отрабатывает нормально, PostBack вызывается, страница обновляется, но нужно события нефига не
    происходит. На сервере не вызывается RaisePostBackEvent.
    Происходит всё так как будто страница не знает, кто вызвал событие и кому отдать его на обработку... - Почему? - если как видно ИД контрола в PostBackReference указано верно????
    3 сентября 2011 г. 14:38

Ответы

  • Всё нашел где был косяк.

    ItemSectionC lick="itemSection_Click"

    Присвоение делегату строки - это плохая идея :) Сделал присвоение делегату метода, который должен выполняться в коде и всё заработало.

    Правдо не понятно как же у стандартных контролов работает присвоение обрабочиков события строками, но это уже другой вопрос :)
    • Помечено в качестве ответа A.G.Sedov 4 сентября 2011 г. 10:26
    4 сентября 2011 г. 10:25

Все ответы

  • Одну ошибку нашел, но проблему это не решило...

    у меня событие то называется ItemSectionClick,а я по привычке написал onclick :)  - эту ошибку я исправил, заменил на ItemSectionClick и теперь

    RaisePostBackEvent у меня вызывается! Ура!

     

    но проблема в том, что не выполняется... -я даже нашел где валится, вот тут:

     

    public virtual void OnItemSectionClick(ItemSectionClickEventArgs e)
            {
                if (ItemSectionClick != null)
                {
                    ItemSectionClick(this, e);
                }
            }
    
    

    почему-то у меня всегда ItemSectionClick имеет значение null, как будто обрабочик события не указан... но он указан:

     

     

    <ItemTemplate>
                                <itemCtrl:itemSection runat="server" ID="itemSection" SectionId='<%# Eval("Id") %>'
                                    SectionName='<%# Eval("Name") %>' ItemSectionClick="itemSection_Click" />
                            </ItemTemplate>
    

    Почему значение оказывается null-овым при выполнении?

     

     



    • Изменено A.G.Sedov 3 сентября 2011 г. 19:59
    3 сентября 2011 г. 19:56
  • Всё нашел где был косяк.

    ItemSectionC lick="itemSection_Click"

    Присвоение делегату строки - это плохая идея :) Сделал присвоение делегату метода, который должен выполняться в коде и всё заработало.

    Правдо не понятно как же у стандартных контролов работает присвоение обрабочиков события строками, но это уже другой вопрос :)
    • Помечено в качестве ответа A.G.Sedov 4 сентября 2011 г. 10:26
    4 сентября 2011 г. 10:25