【问题标题】:Control within another control in asp.net disables server-side events?asp.net中另一个控件中的控件禁用服务器端事件?
【发布时间】:2010-03-24 17:26:02
【问题描述】:

我有一个控件,上面有一个按钮。该按钮所做的只是将用户重定向到另一个页面。在这个控件上,我有另一个控件,它只显示一些东西,没什么特别的。当我单击按钮时,它什么也不做。当我删除或注释掉另一个控件时,按钮事件起作用。这是设计使然吗?我不确定如何修复它或导致它的原因。

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 Button,它可以工作,所以它与 SexyButton 控件有关。

如果我将 asp.net 按钮与 SexyLinkBut​​ton 一起放在 ControB 上,则 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
    }
}

【问题讨论】:

  • 没有看到你的代码就帮不了你。
  • 具体来说,你想看哪些部分?
  • 如果你注释掉第一个控件,你如何导航到另一个页面?
  • @xaisoft 没什么花哨的代码 :)
  • @womp - 好的,我将发布控件的代码。

标签: c# asp.net


【解决方案1】:

可能发生的情况是您的“SexyLinkBut​​ton”控件导致了阻止按钮回发的 javascript 错误。检查浏览器的错误控制台以查看是否生成了任何 javascript 错误。另外,尝试用标准的 LinkBut​​ton 控件代替 SexyLinkBut​​ton,看看是否可以解决问题。

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

【讨论】:

  • 是的,我实际上删除了 SexyLinkBut​​ton 并用 asp.net Button 替换它并且它起作用了。
  • Button1 是当SexyLinkBut​​ton 存在时不会触发的事件。 SexyLinkBut​​ton 工作正常。
  • 是否有任何 javascript 错误?显然,SexyLinkBut​​ton 正在阻止 Button1 触发。 SexyLinkBut​​ton 是否包含表单元素(即当您查看页面源时)?如果是这样,请注意您不能嵌套表单;这可能会导致您看到的那种行为(尽管我认为它通常只会引发错误)。
  • 我发现的一件事是,如果我从 sexylinkbutton 中删除 PostBackUrl 属性,一切正常。相反,我向 SexyLinkBut​​ton 添加了一个点击事件,一切仍然以这种方式工作,所以它与 PostBackUrl 相关。
  • 我将发布SexyButtons的创建者创建的代码。
猜你喜欢
  • 1970-01-01
  • 2012-07-12
  • 2012-11-04
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多