我在ASP.NET 2页面的运行时收到此消息:
页面'MyFolder / blabla.aspx'无法使用用户控件'MyFolder / MyControl.ascx',因为它在web.config中注册并与页面位于同一目录中。
当然我可以将它们分成两个不同的文件夹,从而解决问题,但问题是:
WTF!?!?!为什么我不能把它们放在同一个文件夹里?! 为什么他们不能......相处!?! :)
由于
答案 0 :(得分:12)
由于内部设计考虑因素,这种限制是设计的。
有关详细信息,请参阅here。
<强>说明强>
TagPrefixInfo类允许您以编程方式访问和 修改存储在配置文件中的tag-prefix信息。它 提供与ASP.NET @ 注册相同的功能 指示。标记前缀将ASP.NET中的“命名空间”关联到 必须包含在自定义控件中的程序集和命名空间 和用户控件正常工作。存储TagPrefixInfo对象 作为TagPrefixCollection对象的成员。该 TagPrefixCollection类允许您以编程方式访问 并修改a的页面部分的控件子部分 配置文件。
使用添加将TagPrefixInfo对象添加到集合中 元素并指定 tagPrefix 属性的值 包含其他相关属性的值。另一个要求 信息因您将使用的控件类型而异 指定的标记前缀:
- 如果是用户控件,则必须定义TagPrefix,TagName和Source属性。
- 如果是自定义控件,则必须定义TagPrefix,Namespace和Assembly属性。 Assembly {{3}} 如果控件在应用程序代码中,则不需要属性 目录。相同的 tagPrefix 值可用于映射到多个 程序集或命名空间。
注意指定源时,用户控件本身不能与页面位于同一目录中。如果是,则获得运行时间 尝试加载页面时出错。
答案 1 :(得分:6)
如果您在页面或用户控件中注册它而不是web.config,它将正确加载。 将以下内容添加到页面顶部。
<%@ Register TagPrefix="MyControlTagPrefix" TagName="MyControlTagName" Src="~/MyFolder/MyControl.ascx" %>
答案 2 :(得分:2)
我怀疑你可以在没有注册的情况下完成它,如果它是必要的话。 你可能有一个PlaceHolder,然后使用.Controls.Add(LoadControl(“path.ascx”))
但是如果它不重要,那么由于@Barry说的原因将它放在不同的目录中。
答案 3 :(得分:0)
答案可以在System.Web.dll
的.NET Framework参考源代码中找到:
https://referencesource.microsoft.com/#System.Web/UI/TagNameToTypeMapper.cs,ced01a48dbbb9f9c
TryUserControlRegisterDirectives
不允许位于同一目录中的页面使用配置注册的用户控件,以避免循环引用。更具体地说,这将中断批处理,因为我们的简单依赖性解析器将无法检测到由于标签(VSWhidbey 165042)的存在而触发的隐式依赖性。