在asp.net中的另一个控件内控制会禁用服务器端事件吗?

时间:2010-03-24 17:26:02

标签: c# asp.net

我有一个控件,上面有一个按钮。所有按钮都将用户重定向到另一个页面。在这个控件上我有另一个控件,只显示一些东西,没什么花哨的。当我点击按钮时,它什么也没做。当我删除或注释掉其他控件时,按钮事件有效。这是设计的吗?我不确定如何解决它或导致它的原因。

ControlA.ascx包含一个带有如下事件的按钮:

protected void Button1_Click(object sender, EventArgs e)
{
    Response.Redirect("~/Home.aspx");
}

ControlA.ascx包含其中的另一个控件,我们称之为ControlB.ascx。

当ControlB.ascx在ControlA.ascx中时,Button1单击事件不会触发,但是当我将其删除或取出时,Button1事件将触发并转到Home.aspx。这不仅发生在Button1上,如果我决定添加第二个按钮并为其创建事件,如果ControlB在ControlA中,则第二个按钮事件也不会触发。

ControlA.asx标记和代码:

<div>
    <asp:Button runat="server" ID="Button1" Text="Register 2" 
                           onclick="Button1_Click" />
</div>
<div>
    <uc:ControlB ID="ControlB" runat="server" />
</div>

protected void Button1_Click(object sender, EventArgs e)
{
    Response.Redirect("~/Home.aspx");
}

ControlB.ascx标记:

<div>
  <p>I am control B</p>
  <p>
     <sbi:SexyLinkButton ID="SexyLinkButton1" runat="server" Text="Go Home" 
                         PostBackUrl="~/home.aspx" />

      <asp:Button runat="server" ID="Button1" Text="Register 2" 
                           onclick="Button1_Click" />

</p>
</div>

如前所述,如果ControlB在ControlA中,Button1_Click不会触发,但如果我删除ControlB或将其注释掉,则会触发Button1_Click。

我想出了什么:

ControlB.ascx上有一个名为SexyButton的按钮(没有创建这个,别人做了,哈哈)当我从ControlB中删除它时,ControlA的按钮工作。我在controlB中放了一个asp.net按钮,它有效,所以它与SexyButton控件有关。

如果我在ControB上放置一个asp.net按钮和SexyLinkBut​​ton,ControlB上的Button1事件就不起作用。

SexyLinkBut​​ton.cs - 如果我将PostBackUrl放在SexyLinkBut​​ton上,asp.net按钮事件不会触发。以下是SexyLinkBut​​ton.cs的代码:

public class SexyLinkButton : LinkButton
{
    private List<string> Css = new List<string> ();

    public string IconCssClass { get; set; }
    public SizeEnum Size { get; set; }

    public SexyLinkButton()
    {
        Size = SizeEnum.Normal;
    }

    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        if (!string.IsNullOrEmpty(CssClass)) Css.Add(CssClass);             // User added Css
        Css.Add("sbi-button");                                              // Standard Css for button
        if (Size != SizeEnum.Normal) Css.Add(Size.ToString().ToLower());    // Size Css

        // Nested spans per design and css requirements
        HtmlGenericControl span1 = new HtmlGenericControl("span");
        HtmlGenericControl span2 = new HtmlGenericControl("span");

        // Nested span only for icon
        if (!string.IsNullOrEmpty(this.IconCssClass))
        {
            HtmlGenericControl btnspan = new HtmlGenericControl("span");
            btnspan.Attributes.Add("class", IconCssClass.Replace(".", string.Empty));
            btnspan.InnerHtml = this.Text;
            span2.Controls.Add(btnspan);
        }
        else
        {
            span2.InnerHtml = this.Text;
        }

        CssClass = string.Join(" ",Css.ToArray());
        this.Text = "";
        span1.Controls.Add(span2);
        this.Controls.Add(span1);

        base.Render(writer);
    }

    public enum SizeEnum
    {
        Normal,
        Medium,
        Large
    }
}

1 个答案:

答案 0 :(得分:3)

可能发生的是你的“SexyLinkBut​​ton”控件导致javascript错误导致你的按钮回发。检查浏览器的错误控制台以查看是否正在生成任何javascript错误。另外,尝试替换标准的LinkBut​​ton控件而不是SexyLinkBut​​ton来查看是否可以修复它。

编辑:看起来它实际上是PostBackUrl的表单问题。