在与页面相同的文件夹中使用用户控件

时间:2010-06-03 08:31:32

标签: asp.net user-controls

我在ASP.NET 2页面的运行时收到此消息:

页面'MyFolder / blabla.aspx'无法使用用户控件'MyFolder / MyControl.ascx',因为它在web.config中注册并与页面位于同一目录中。

当然我可以将它们分成两个不同的文件夹,从而解决问题,但问题是:

WTF!?!?!为什么我不能把它们放在同一个文件夹里?! 为什么他们不能......相处!?! :)

由于

4 个答案:

答案 0 :(得分:12)

由于内部设计考虑因素,这种限制是设计的。

有关详细信息,请参阅here

  

<强>说明

     

TagPrefixInfo类允许您以编程方式访问和   修改存储在配置文件中的tag-prefix信息。它   提供与ASP.NET @ 注册相同的功能   指示。标记前缀将ASP.NET中的“命名空间”关联到   必须包含在自定义控件中的程序集和命名空间   和用户控件正常工作。存储TagPrefixInfo对象   作为TagPrefixCollection对象的成员。该   TagPrefixCollection类允许您以编程方式访问   并修改a的页面部分的控件子部分   配置文件。

     

使用添加将TagPrefixInfo对象添加到集合中   元素并指定 tagPrefix 属性的值   包含其他相关属性的值。另一个要求   信息因您将使用的控件类型而异   指定的标记前缀:

     
      
  • 如果是用户控件,则必须定义TagPrefixTagNameSource属性。
  •   
  • 如果是自定义控件,则必须定义TagPrefixNamespaceAssembly属性。 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)的存在而触发的隐式依赖性。

相关问题