0

概括 :

Project1 包含一个用户控件 tab1.ascx(基本上是面板 1、2、3 等的集合)

Project2 在 Project1 中被引用。

Project2 包含一个母版页 (MasterPage.cs),我想在其中调用此用户控件 (tab1.ascx)。

从项目 2 调用用户控件的原因是我可以根据用户权限集中控制从母版页启用/禁用选项卡。例如对于管理员,所有选项卡都将可见。对于普通用户,只有第一个选项卡可见。

问题:

我无法在项目 2 中添加项目 1 的引用(循环依赖)。

我能够找到控件并且可以使用强制转换(System.Web.UI.UserControl),但是这种强制转换并不能帮助我调用实际用户控件的方法 - tab1.ascx

有什么方法可以引用项目 2 中的用户控件?

编辑:使用以下代码我可以调用该方法:

tab1.GetType().InvokeMember("DisableTab", BindingFlags.InvokeMethod, null, tab1, new object[] { "Conf Tests" });

现在,它实际上是在调用用户控件的 DisableTab 方法。但它无法找到其中的项目。theTabStr.Items 返回 0。

theTabStr 实际上是一个中继器控件。

    public void DisableTab(string strTabName)
    {
        foreach (RepeaterItem itmRptr in theTabStr.Items)
        {
            LinkButton lnkbtnTab = (LinkButton)itmRptr.FindControl("theTab");
            if (lnkbtnTab != null && lnkbtnTab.Text == strTabName)
            {
                lnkbtnTab.Enabled = false;
            }
        }
    }

谢谢。

4

3 回答 3

1

您需要解决循环依赖问题。重新考虑您的设计。如果需要在两个项目之间共享某些东西,那么您可以创建第三个项目来封装控件是理所当然的。

于 2013-07-08T15:09:01.360 回答
0

那么我会声明接口,让我们说

interface IControl {
    void foo();
}

在 Project2 中,让这个 tab1.ascx 实现这个接口,一旦你找到它就输入 control 到这个接口。(此接口也可以在 Project3 中定义,Project1 和 Project2 都将引用该接口)。

于 2013-07-08T15:06:28.833 回答
0

这对于用户控件是不可能的。

如果要跨项目边界共享自定义控件,则必须在从 Control 或现有控件继承的单独 DLL 中创建自定义控件,如本 msdn 文章中所述:http: //msdn.microsoft.com/en-我们/图书馆/zt27tfhy(v=vs.100).aspx

如果您确实想使用您创建的用户控件,则必须将其复制到“project2”中

于 2013-07-08T15:13:55.583 回答