Событие кнопки OnClick не срабатывает - PullRequest
0 голосов
/ 28 ноября 2010

Следующий код - моя страница ASP.NET:

<MdsMenu:MenuItem Text="Button" Href="#">
   <asp:Button ID="Button1" runat="server" Text="Button 01" OnClick="Button_Click" />
   <asp:Button ID="Button2" runat="server" Text="Button 02" OnClick="Button_Click" />
</MdsMenu:MenuItem>

Я не знаю, почему событие Button_Click не срабатывает !!!

protected void Button_Click(object sender, EventArgs e)
{
   Button senderButton = sender as Button;
   Label1.Text = senderButton.ID.ToString();
}

MdsMenu: MenuItem - мой пользовательский WebControl. Если я вставляю элемент управления Button из тега MdsMenu: MenuItem, он работает хорошо, но если я вставляю его в тег MdsMenu: MenuItem, он не вызывает соответствующий метод. Что не так с моим кодом?

Спасибо.

Редактировать:

Menu.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Permissions;
using System.Collections;
using System.ComponentModel.Design;
using System.Drawing.Design;
using System.Web.UI.HtmlControls;
using System.IO;

namespace MenuServerControl
{
    [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
    [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
    [DefaultProperty("MenuItems")]
    [ParseChildren(true, "MenuItems")]
    [ToolboxData("<{0}:Menu runat=\"server\"> </{0}:Menu>")]
    public class Menu : WebControl
    {
        #region Fields

        private List<MenuItem> _MenuItems;
        string _Direction
        {
            get
            {
                string direction = "";
                switch (this.Direction)
                {
                    case Directions.LeftToRight:
                        direction = "direction:ltr;";
                        break;
                    case Directions.RightToLeft:
                        direction = "direction:rtl;";
                        break;
                    default:
                        direction = "direction:rtl;";
                        break;
                }
                return direction;
            }
        }
        string _AnimationDelay
        {
            get
            {
                if (AnimationDelay == null)
                    AnimationDelay = 1000;
                return AnimationDelay.ToString().ToLower();
            }
        }
        string _AnimationType
        {
            get
            {
                switch (this.AnimationType)
                {
                    case AnimationType.Opacity_Height:
                        return "animation:{opacity:'show',height:'show'}";
                    case AnimationType.Opacity_Width:
                        return "animation:{opacity:'show',width:'show'}";
                    case AnimationType.Opacity:
                        return "animation:{opacity:'show'}";
                    case AnimationType.Height:
                        return "animation:{height:'show'}";
                    case AnimationType.Width:
                        return "animation:{width:'show'}";
                    case AnimationType.Height_Toggle:
                        return "animation: {height: 'toggle'}";
                    case AnimationType.Width_Toggle:
                        return "animation: {width: 'toggle'}";
                    default:
                        return "animation:{opacity:'show',height:'show'}";
                }
            }
        }
        string _AnimationSpeed
        {
            get
            {
                switch (this.AnimationSpeed)
                {
                    case AnimationSpeed.Fast:
                        return "speed:'fast'";
                    case AnimationSpeed.Normal:
                        return "speed:'normal'";
                    case AnimationSpeed.Slow:
                        return "speed:'slow'";
                    default:
                        return "speed:'fast'";
                }
            }
        }
        string FloatStyle
        {
            get
            {
                if (Direction == Directions.RightToLeft)
                    return "float:right;";
                else return "";
            }
        }
        string _Main_ul_CssClass = "";

        #endregion

        #region Properties

        public string Main_ul_CssClass
        {
            get
            {
                if (string.IsNullOrEmpty(_Main_ul_CssClass)) return "";
                _Main_ul_CssClass = "class=" + _Main_ul_CssClass;
                return _Main_ul_CssClass;
            }

            set
            {
                _Main_ul_CssClass = value.Trim();
            }
        }

        public Directions Direction { get; set; }

        public int? AnimationDelay { get; set; }

        public AnimationType AnimationType { get; set; }

        public AnimationSpeed AnimationSpeed { get; set; }

        public bool DropShadow { get; set; }

        public bool AutoArrows { get; set; }

        [Category("Behavior")]
        [Description("The menu collection")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
        public List<MenuItem> MenuItems
        {
            get
            {
                if (_MenuItems == null)
                    _MenuItems = new List<MenuItem>();
                return _MenuItems;
            }
        }

        public VerOrHor VerticalOrHorizontal { get; set; }

        #endregion

        #region Methods

        public Menu()
        {
            DropShadow = true;
            AutoArrows = true;
        }

        public override void RenderBeginTag(HtmlTextWriter writer)
        {
            writer.Write("<div id=\"" + this.ID + "\" style=\"" + _Direction + " " + FloatStyle + "\">");
        }

        public override void RenderEndTag(HtmlTextWriter writer)
        {
            writer.Write("</div>");
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            #region Adding Script & link Tags

            HtmlGenericControl jquery = new HtmlGenericControl("script");
            jquery.Attributes.Add("type", "text/javascript");
            jquery.Attributes.Add("src", Page.ClientScript.GetWebResourceUrl(typeof(MenuServerControl.Menu), "MenuServerControl.JavaScriptFiles.jquery_1_4_3.js"));
            jquery.EnableViewState = false;
            Page.Header.Controls.Add(jquery);

            HtmlGenericControl hoverIntent = new HtmlGenericControl("script");
            hoverIntent.Attributes.Add("type", "text/javascript");
            hoverIntent.Attributes.Add("src", Page.ClientScript.GetWebResourceUrl(typeof(Menu), "MenuServerControl.JavaScriptFiles.hoverIntent.js"));
            hoverIntent.EnableViewState = false;
            Page.Header.Controls.Add(hoverIntent);

            HtmlGenericControl jquery_bgiframe_min = new HtmlGenericControl("script");
            jquery_bgiframe_min.Attributes.Add("type", "text/javascript");
            jquery_bgiframe_min.Attributes.Add("src", Page.ClientScript.GetWebResourceUrl(typeof(Menu), "MenuServerControl.JavaScriptFiles.jquery_bgiframe_min.js"));
            jquery_bgiframe_min.EnableViewState = false;
            Page.Header.Controls.Add(jquery_bgiframe_min);

            HtmlGenericControl superfish = new HtmlGenericControl("script");
            superfish.Attributes.Add("type", "text/javascript");
            superfish.Attributes.Add("src", Page.ClientScript.GetWebResourceUrl(typeof(Menu), "MenuServerControl.JavaScriptFiles.superfish.js"));
            superfish.EnableViewState = false;
            Page.Header.Controls.Add(superfish);

            HtmlGenericControl supersubs = new HtmlGenericControl("script");
            supersubs.Attributes.Add("type", "text/javascript");
            supersubs.Attributes.Add("src", Page.ClientScript.GetWebResourceUrl(typeof(Menu), "MenuServerControl.JavaScriptFiles.supersubs.js"));
            supersubs.EnableViewState = false;
            Page.Header.Controls.Add(supersubs);

            if (Direction == Directions.LeftToRight)
            {
                HtmlGenericControl csslink = new HtmlGenericControl("link");
                csslink.Attributes.Add("href", Page.ClientScript.GetWebResourceUrl
                    (typeof(Menu), "MenuServerControl.CSS.superfish.css"));
                csslink.ID = "NavigationMenu";
                csslink.Attributes.Add("type", "text/css");
                csslink.Attributes.Add("rel", "stylesheet");
                csslink.EnableViewState = false;
                Page.Header.Controls.Add(csslink);
            }
            else
            {
                HtmlGenericControl csslink = new HtmlGenericControl("link");
                csslink.Attributes.Add("href", Page.ClientScript.GetWebResourceUrl
                    (typeof(Menu), "MenuServerControl.CSS.RightToLeft superfish.css"));
                csslink.ID = "NavigationMenu";
                csslink.Attributes.Add("type", "text/css");
                csslink.Attributes.Add("rel", "stylesheet");
                csslink.EnableViewState = false;
                Page.Header.Controls.Add(csslink);
            }

            if (this.VerticalOrHorizontal == VerOrHor.Vertical && this.Direction == Directions.RightToLeft)
            {
                HtmlGenericControl csslink01 = new HtmlGenericControl("link");
                csslink01.Attributes.Add("href", Page.ClientScript.GetWebResourceUrl
                    (typeof(Menu), "MenuServerControl.CSS.RightToLeft superfish-vertical.css"));
                csslink01.Attributes.Add("type", "text/css");
                csslink01.Attributes.Add("rel", "stylesheet");
                csslink01.EnableViewState = false;
                Page.Header.Controls.Add(csslink01);
            }
            else if (this.VerticalOrHorizontal == VerOrHor.Vertical)
            {
                HtmlGenericControl csslink01 = new HtmlGenericControl("link");
                csslink01.Attributes.Add("href", Page.ClientScript.GetWebResourceUrl
                    (typeof(Menu), "MenuServerControl.CSS.superfish-vertical.css"));
                csslink01.Attributes.Add("type", "text/css");
                csslink01.Attributes.Add("rel", "stylesheet");
                csslink01.EnableViewState = false;
                Page.Header.Controls.Add(csslink01);
            }

            #endregion
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(CreateMenuHtmlTags());
        }

        StringBuilder CreateMenuHtmlTags()
        {
            if (this._MenuItems == null)
                throw new Exception("تگ های مربوط به منو را کامل کنید");

            StringBuilder Html = new StringBuilder("");

            #region Add <Script>

            if (String.IsNullOrEmpty(Main_ul_CssClass))
                Html.Append("<script>$(document).ready(function() { $(\"ul.sf-menu\").superfish({pathLevels:    1,");
            else
                Html.Append("<script>$(document).ready(function() { $(\"ul." + Main_ul_CssClass + "\").superfish({ pathLevels:    1,");

            Html.Append("delay:" + _AnimationDelay + ",");
            Html.Append(_AnimationType + ",");
            Html.Append(_AnimationSpeed + ",");
            Html.Append("dropShadows:  " + DropShadow.ToString().ToLower() + ",");
            Html.Append(@"autoArrows:  " + AutoArrows.ToString().ToLower() + "});});</script>");

            #endregion

            if (string.IsNullOrEmpty(Main_ul_CssClass) && VerticalOrHorizontal == VerOrHor.Vertical)
                Html.Append("<ul class=\"sf-menu sf-vertical sf-js-enabled sf-shadow\" id='sample-menu-1'>");
            else if (String.IsNullOrEmpty(Main_ul_CssClass))
                Html.Append("<ul class=\"sf-menu sf-js-enabled sf-shadow\" id='sample-menu-1'>");
            else
                Html.Append("<ul class=\"" + Main_ul_CssClass + "\" id='sample-menu-1'>");

            foreach (MenuItem item in _MenuItems)
            {
                if (item == null) continue;
                if (item.SubMenuItems != null && item.SubMenuItems.Count > 0)
                {
                    Html.Append("<li" + item.li_CssClass + ">");
                    Html.Append("<a href=\"" + item.Href + "\">" + item.Text.Trim() + "</a>");
                    ParseSubMenuItems(ref Html, item);
                    Html.Append("</li>");
                }
                else if (item.SubMenuItems != null)
                    Html.Append("<li" + item.li_CssClass + "><a href=\"" + item.Href + "\">" + item.Text.Trim() + "</a></li>");
            }
            Html.Append("</ul>");

            return Html;
        }

        void ParseSubMenuItems(ref StringBuilder Html, MenuItem menuItems)
        {
            if (menuItems == null) return;

            Html.Append("<ul " + menuItems.ul_CssClass + " style=\"display: none; visibility: hidden;\">");

            foreach (var item in menuItems.SubMenuItems)
            {
                if (item == null) continue;

                MenuItem Sub_MenuItem = item as MenuItem;
                WebControl webControl = item as WebControl;

                if (Sub_MenuItem != null)
                {
                    if (Sub_MenuItem.SubMenuItems != null && Sub_MenuItem.SubMenuItems.Count > 0)
                    {
                        Html.Append("<li" + Sub_MenuItem.li_CssClass + ">");
                        Html.Append("<a href=\"" + Sub_MenuItem.Href + "\">" + Sub_MenuItem.Text.Trim() + "</a>");
                        ParseSubMenuItems(ref Html, Sub_MenuItem);
                        Html.Append("</li>");
                    }
                    else if (Sub_MenuItem.SubMenuItems != null)
                        Html.Append("<li" + Sub_MenuItem.li_CssClass + "><a href=\"" + Sub_MenuItem.Href + "\">" + Sub_MenuItem.Text.Trim() + "</a></li>");
                }
                else if (webControl != null)
                {
                    Html.Append("<li>");
                    webControl.EnableViewState = true;
                    this.Controls.Add(webControl);
                    webControl.EnableViewState = true;

                    StringBuilder sb = new StringBuilder();
                    sb.Append("<div>");
                    using (StringWriter sw = new StringWriter(sb))
                    {
                        using (HtmlTextWriter textWriter = new HtmlTextWriter(sw))
                        {
                            webControl.RenderControl(textWriter);
                        }
                    }

                    sb.Append("</div>");

                    Html.Append(sb.ToString());
                    Html.Append("</li>");
                }
            }
            Html.Append("</ul>");
        }

        #endregion
    }
}

MenuItem.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;

namespace MenuServerControl
{
    [DefaultProperty("SubMenuItems")]
    [ParseChildren(true, "SubMenuItems")]
    [TypeConverter(typeof(ExpandableObjectConverter))]
    public class MenuItem : INamingContainer
    {
        #region Fields

        ArrayList _SubMenuItems;
        string text = "";
        string href = "#";
        string _ul_CssClass = "";
        string _li_CssClass = "";

        #endregion

        #region Properties

        [Description("متن منو آیتم")]
        [DefaultValue("")]
        [NotifyParentProperty(true)]
        public string Text
        {
            get
            {
                return text;
            }

            set
            {
                text = value;
            }
        }

        [DefaultValue("#")]
        [Description("<a /> href attribute")]
        [NotifyParentProperty(true)]
        public string Href
        {
            get
            {
                return href;
            }

            set
            {
                href = value;
            }
        }

        [DefaultValue("")]
        [Description("<ul /> css class")]
        [NotifyParentProperty(true)]
        public string ul_CssClass
        {
            get
            {
                if (string.IsNullOrEmpty(_ul_CssClass)) return "";
                _ul_CssClass = " class=\"" + _ul_CssClass + "\"";
                return _ul_CssClass;
            }
            set { this._ul_CssClass = value.Trim(); }
        }

        [DefaultValue("")]
        [Description("<li /> css class")]
        [NotifyParentProperty(true)]
        public string li_CssClass
        {
            get
            {
                if (string.IsNullOrEmpty(_li_CssClass)) return "";
                _li_CssClass = " class=\"" + _li_CssClass + "\"";
                return _li_CssClass;
            }
            set { this._li_CssClass = value.Trim(); }
        }

        [Category("Behavior")]
        [Description("The MenuItems collection")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
        public ArrayList SubMenuItems
        {
            get
            {
                if (_SubMenuItems == null)
                    _SubMenuItems = new ArrayList();
                return _SubMenuItems;
            }
        }

        #endregion
    }
}

Вы можете скачать проект с здесь .

1 Ответ

1 голос
/ 30 ноября 2010

Шаг # 1: иметь скрытую кнопку с нужным OnClick за пределами элемента управления, на самой странице .aspx, например.

<asp:Button ID="Button1" runat="server" OnClick="Button_Click" style="display: none;"  />

Шаг # 2: включите OnClientClick в кнопке внутри элемента управления, например:

<asp:Button ID="SomeIdHere" runat="server" Text="Button 01" OnClientClick="return MakeRealClick('Button1');" />

Убедитесь, что в качестве аргумента функции «MakeRealClick» указан идентификатор «реальной» кнопки.

Шаг № 3: иметь этот код JavaScript на странице:

<script type="text/javascript">
    function MakeRealClick(sButtonID) {
        var arrInputs = document.getElementsByTagName("input");
        for (var i = 0; i < arrInputs.length; i++) {
            var oCurInput = arrInputs[i];
            if (oCurInput.type == "submit" && (oCurInput.id == sButtonID || EndsWith(oCurInput.id, "_" + sButtonID)))
                oCurInput.click();
        }
        return false;
    }

    function EndsWith(s1, s2) {
        return (s1.length >= s2.length) && (s1.substr(s1.length - s2.length, s2.length) == s2);
    }
</script>

Это приведет к тому, что при нажатии кнопка внутри меню будет искать другую кнопку, которая находится за пределами меню, таким образом, все еще имеет «настоящий» OnClick, и автоматически щелкает ее, так что конечный результат такой же, как если бы вы щелкнули скрытую кнопка.

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

...