如何从控件中获取页面组件?

时间:2010-10-25 21:49:27

标签: asp.net controls assemblies

我创建了一个方法来获取当前页面的程序集名称和版本,以便我可以在页脚中显示它。它运行得很好,但我想将这个逻辑移动到一个控件中,我可以将其放入任何引用我的控件库的Web应用程序项目母版页中。但是,在控件库中Assembly.GetExecutingAssembly()返回控件库程序集,而不是Web项目程序集。

以下是方法:

    private string GetVersion()
    {
        const string cacheKey = "Web.Controls.ApplicationVersion";
        string version = (string) Page.Cache[cacheKey];
        if (version == null)
        {
            Assembly assembly = Assembly.GetExecutingAssembly();

            // get the assembly version
            Version assemblyVersion = assembly.GetName().Version;

            // get the product name
            string productName;
            AssemblyProductAttribute productAttribute =
                assembly.GetCustomAttributes(typeof (AssemblyProductAttribute), false).Cast
                    <AssemblyProductAttribute>().FirstOrDefault();
            if (productAttribute != null)
            {
                productName = productAttribute.Product;
            }
            else
            {
                productName = String.Empty;
            }

            version = String.Format("{0} {1}", productName, assemblyVersion);

            Page.Cache[cacheKey] = version;
        }

        return version;
    }

我也尝试过返回null的Assembly.GetEntryAssembly()和返回控件程序集的Assembly.GetCallingAssembly()。最后我尝试了Assembly.GetAssembly(Page.GetType()),它返回在运行时生成的页面类型(ASP.abc)。

如何从Control的上下文中获取Web项目程序集,而不是通过名称明确请求它?

1 个答案:

答案 0 :(得分:1)

也许不及时。但今天我遇到了同样的问题。首先我发现的是你的问题没有答案(后来我在这个问题上挖掘。 答案是:Assembly.GetAssembly(Page.GetType().BaseType)

原因是如上所述,在运行时生成页面类型。 我在MSDN中找到了很好的解释:

  

特定页面的HTTP处理程序的类型取决于URL。   第一次调用URL时,将组成一个新类   动态编译为程序集。该类的源代码是   检查.aspx源的解析过程的结果。该   class被定义为命名空间ASP的一部分,并给出了一个名称   模仿原始网址。例如,如果URL端点是   page.aspx,该类的名称是ASP.Page_aspx。班级名称,   但是,可以通过设置ClassName以编程方式控制   @Page指令中的属性。

     

HTTP处理程序的基类是Page。这个类定义了   所有页面处理程序共享的最小方法和属性集。该   Page类实现了IHttpHandler接口。

     

在几种情况下,实际处理程序的基类   不是Page而是一个不同的类。例如,如果发生这种情况   使用代码隐藏。代码隐藏是一种开发技术   将页面所需的代码隔离到单独的C#或Microsoft中   VisualBasic®.NET类。页面的代码是事件集   实际创建行为的处理程序和帮助程序方法   页。可以使用内联函数定义此代码   标记或放置在外部类中 - 代码隐藏类。一个   代码隐藏类是一个继承自Page和specialized的类   它有额外的方法。指定时,使用代码隐藏类   作为HTTP处理程序的基类。

因此,当您使用Page.GetType()时,您将获得动态组合类。这个类继承自实际的页面类,这个类是进入项目组装的。 http://msdn.microsoft.com/en-us/library/aa479007.aspx -MSDN文章引用。