【问题标题】:How to override an UserControl method in ascx file without a source?如何在没有源的情况下覆盖 ascx 文件中的 UserControl 方法?
【发布时间】:2014-01-26 09:04:05
【问题描述】:

我有一个从UserControl 继承的控件。这个控件上有一个LinkButtonLbButtonClick(object sender, EventArgs e) 方法。我只有一个用于此控件的 ascx 文件和一个预编译程序集。

我需要用我自己的自定义方法替换LbButtonClick 方法。这该怎么做?我可以在 ascx 文件中执行此操作,还是必须在第一次在网页上加载控件时对其进行修改。

如果可能的话,我想使用第一个解决方案(ascx 文件) - 使我的修改尽可能接近控件本身。

已编辑

我要感谢 @pid 和 @Francesco Milani 的帮助。我正在考虑他们的解决方案,但在实施它们之前,我只是尝试了另一件事。我只是在上述控件的 ascx 文件中添加了这段代码。

<script runat="server" type="text/C#">
    protected void LbButtonClick(object sender, EventArgs e)
    {
        //Some code here...
    }
</script>

它奏效了。似乎允许在 ascx 文件中重新定义方法,并且调用此重新定义的方法而不是在程序集中预编译的方法。我没有从编译器那里得到任何信息,也没有警告或提示。很奇怪,我不明白。由于这比建议的解决方案更简单、更清晰,我会接受它作为答案,但我不喜欢接受我自己的答案。

也许有人可以解释一下为什么上述构造有效?

【问题讨论】:

    标签: c# user-controls asp.net-4.0 ascx


    【解决方案1】:

    从未尝试过,但您应该能够从该类派生,然后在表单中使用它。如果班级被密封...不要骰子!

    另一种方法是将 ASCX 包裹在您自己的周围,从原始 ASCX 中删除按钮(通过编辑其 HTML),然后在您自己的中添加一个按钮。单击您自己的按钮时,“手动”触发内部 ASCX 的单击事件:LbButtonClick(mySender, myArgs)

    我很好奇这是怎么回事。请告诉我们你是如何解决这个问题的!

    【讨论】:

    • 您好,根据您的要求,我正在编辑的答案中告知我是如何解决问题的。 :) 抱歉回复晚了,之前没时间写。
    • 你的自我回答其实很有趣。 +1 分享!
    【解决方案2】:

    看看这个。

    testControl.acx

    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="testControl.ascx.cs" Inherits="TestWebApp.testControl" %>
    <asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
    

    和代码隐藏:

    protected void Page_Load(object sender, EventArgs e)
    {
        this.LinkButton1.Click += LinkButton1_Click;
    }
    
    private void LinkButton1_Click(object sender, EventArgs e)
    {
        Response.Redirect("http://www.google.com");
    }
    

    在您的示例中,您无权访问 LinkBut​​ton1_Click 方法.. 所以

    default.aspx

    <%@ Register Src="~/testControl.ascx" TagPrefix="uc1" TagName="testControl" %>
    
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <uc1:testControl runat="server" id="testControl" />
        </div>
        </form>
    </body>
    </html>
    

    和代码隐藏:

        protected void Page_Load(object sender, EventArgs e)
        {
            foreach (LinkButton lb in testControl.Controls)
            {
                if (lb.ID == "LinkButton1")
                lb.Click += lb_Click;
            }
        }
    
        private void lb_Click(object sender, EventArgs e)
        {
            Response.Redirect("http://www.microsoft.com");
        }
    

    所以你将被重定向到微软而不是谷歌。 希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多