如何在没有源的情况下覆盖ascx文件中的UserControl方法?

时间:2014-01-26 09:04:05

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

我有一个继承自UserControl的控件。此控件上有一个LinkButton LbButtonClick(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文件中重新定义方法,并且调用此重新定义的方法而不是在程序集中预编译的方法。我没有得到编译器的信息,没有警告或提示。很奇怪,我不明白。由于这比建议的解决方案更容易和更清洁,我会接受它作为答案,但我不想接受我自己的答案。

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

2 个答案:

答案 0 :(得分:0)

从未尝试过这个,但你应该能够从类派生,然后在表单中使用它。如果课程被密封......没有骰子!

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

我很好奇这是如何运作的。请告诉我们您是如何解决这个问题的!

答案 1 :(得分:0)

看看这个。

testControl.acx

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

和codebehind:

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>

和codebehind:

    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");
    }

因此,您将重定向到Microsoft而不是Google。 希望它有所帮助