【问题标题】:How do I refer to the type of an ascx by type name?如何通过类型名称引用 ascx 的类型?
【发布时间】:2014-02-15 22:05:14
【问题描述】:

我刚刚在 ASP.NET 中发现了一个非常晦涩的功能,它允许将控件映射到另一个控件。如果您没有控件的源,但您希望将其替换为对源的影响最小的自定义控件,这将非常有用。本质上,它就像一个 ControlAdapter 一样工作,只是整个类型被重新映射到另一种类型。你只需要修改你的 web.config 文件:

   <pages>
      <tagMapping>
         <add
            tagType=
               "System.Web.UI.WebControls.WebParts.WebPartManager"
            mappedTagType=
               "Microsoft.Sharepoint.WebPartPartManager, 
                MSPS.Web.dll, Version='2.0.0.0'" 
         />
      </tagMapping>
   </pages>

MSDN documentation 说:

tagMapping 元素定义了一组标记类型,它们是 在编译时重新映射到其他标记类型。这种重新映射导致 用于代替所有页面的原始标记类型的映射类型 和控件在 ASP.NET 应用程序范围内 配置文件。

我能够映射 UserControl 而不是标准控件,但我的替换 UserControl 没有显示。

我意识到我指的是错误的类型。为了使它工作,我必须引用 ASPX 类型名称,而不是它继承的类型。这可能是导致问题的原因吗?如果是,我如何找到 ascx 的类型?

更新: 理查德为我提供了一个很好的答案线索。不幸的是,我仍然有两个问题:

首先,虽然 Richard 的 ClassName 建议为我的 ascx 提供了一个一致的名称,但我要替换的另一个控件不使用该属性。我想避免弄乱第三方代码,我不知道它会有什么副作用。但是,我可以使用 ASP.NET 生成的 ClassName,前提是它不会在编译或执行环境中改变。

其次,由于这两个类型名称都是在运行时而不是编译时生成的,所以 web.config 吓坏了,声称它无法加载该类型。

【问题讨论】:

    标签: asp.net webforms user-controls


    【解决方案1】:

    在控件 (.ascx) 中使用@Control 指令来定义具有ClassName 属性的控件的类型名。例如。

    <%@ Control Language="VB" ClassName='MyNamespace.MyControl" %>
    

    【讨论】:

    • 如果.ascx 没有指定类型名称,那么在编译.ascx 时会生成一个类型名称。我怀疑(在运行时检查)这将不一致。如果是第三方代码,则引发未指定的缺陷。
    • @user148298:查看之前的评论(忘记输入你的名字。)
    • 再次感谢。第三方控件没有指定,也不必指定,因为他们建议修改 ascx 的副本。无论如何,ClassNames 是不可用的,因为它们直到运行时才被编译。
    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 2011-10-11
    • 2013-08-20
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多