Asp.net 如何将用户控件从单独的程序集添加到Sharepoint应用程序页上?

Asp.net 如何将用户控件从单独的程序集添加到Sharepoint应用程序页上?,asp.net,sharepoint,web-config,sharepoint-2007,iis-6,Asp.net,Sharepoint,Web Config,Sharepoint 2007,Iis 6,这个问题可能有一个非常简单的解决方案,但由于我根本不了解Sharepoint,而且似乎无法通过谷歌搜索我在这方面的智慧,也许你们中的一位可以引导我朝着正确的方向前进 背景: 目前,我在一个项目中工作,我们的web解决方案的一部分是由Sharepoint构成的,我以前绝对没有Sharepoint方面的经验。最近,我一直在努力完成一项看起来非常简单的任务,即在我们的解决方案中的一个Sharepoint页面中添加一个web用户控件。这项任务有两个重要要求 用户控件和后面的代码必须位于并组成一个单独的程

这个问题可能有一个非常简单的解决方案,但由于我根本不了解Sharepoint,而且似乎无法通过谷歌搜索我在这方面的智慧,也许你们中的一位可以引导我朝着正确的方向前进

背景: 目前,我在一个项目中工作,我们的web解决方案的一部分是由Sharepoint构成的,我以前绝对没有Sharepoint方面的经验。最近,我一直在努力完成一项看起来非常简单的任务,即在我们的解决方案中的一个Sharepoint页面中添加一个web用户控件。这项任务有两个重要要求

用户控件和后面的代码必须位于并组成一个单独的程序集 该大会必须签署 用户控件程序集实际上是另一个带有Default.aspx的ASP.NET Web应用程序,因此我可以使用Cassini使用实体模型调试用户控件。当我通过Default.aspx调试它时,它工作正常,显示用户控件,我可以按预期使用它

我的web.config中有以下行:

<SafeControls>
[..]
<SafeControl Assembly="MyMainNamespace.SubNamespace.SelectorPopup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7fa78676161515a2" Namespace="MyMainNamespace.SubNamespace.SelectorPopup" TypeName=" *" Safe=" True " />
[..]
</SafeControl>
在Sharepoint页面上,我放置了以下内容:

<% @Register TagPrefix= "Selector" Namespace="MyMainNamespace.SubNamespace.SelectorPopup" Assembly="MyMainNamespace.SubNamespace.SelectorPopup" %>
[..]
<Selector:SelectorBoxControl runat="server" SelectorType="ContentArea" ></ Selector: SelectorBoxControl>
我们的项目是部署在IIS6 Windows Server 2003上的.NET 3.5 2.0上的ASP.NET web项目,我们使用的是Sharepoint 2007、SQL Server 2005。构建、部署和VisualStudio标记都可以

问题: 部署到我们的测试环境后,Sharepoint页面上根本不显示用户控件,我也不明白为什么

构建和部署工作正常,甚至会显示Sharepoint页面,只是看不到我的控件。实际上,HTML响应中完全没有我的用户控件的痕迹。即使我在控件中放置纯HTML文本而没有任何功能。没有错误消息,事件处理程序也不提供有关可能的错误或警告的信息


我错过什么了吗?有什么我需要启用的,我需要添加的属性或某个引用吗?我是否可以让这种非显示行为生成可理解的错误消息?

我认为您需要向GAC for SharePoint注册dll才能找到它。不过我可能错了,复制到bin dir就行了。 但是我很确定,在注册时,您需要在Assembly属性中使用完全限定名

<% @Register TagPrefix= "Selector" Namespace="MyMainNamespace.SubNamespace.SelectorPopup" Assembly="MyMainNamespace.SubNamespace.SelectorPopup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7fa78676161515a2" %>

我将此作为回答,因为尽管我们在评论中进行了交流,但我不确定你和我谈论的是同一件事

如您所知,ASP.NET中有两种控件:用户控件和web自定义控件。用户控件有一个包含标记的.ascx文件,这很重要,不能在项目之间共享。编译它们所在的项目并引用该程序集是没有好处的,因为.ascx文件不是程序集的一部分。Web自定义控件没有标记文件:它们完全是在代码中创建的,它们的控件是通过编程方式创建的,并添加到自定义控件的控件集合中

因此,您要替换的独立程序集中的第三方控件是web自定义控件,或者(如果它在源代码中使用单独的标记文件),它必须使用技巧(如虚拟路径提供程序技巧)来实现这一点

您已经谈论了您的用户控件和您的代码,就好像它们是分开的一样,这让我相信您确实在谈论web用户控件。但是这些不能在web项目之间共享。如果控件需要存在于外部程序集中,最简单的方法是将其重新编写为以编程方式构建其内容的自定义控件


还有其他选择,例如解决方案,或者Scott Guthrie的著名解决方案。但最简单的选择是将其作为自定义控件编写

我在这里冒险走出我的舒适区,因为我不是一个SharePoint wallah,但除非这一点在去年有所改变,否则你不能在web项目中使用ASP.NET用户控件——这种控件在单独的.ascx文件中有标记,而不是在其中创建它们。不过,还有一些变通方法。我相信你错了,因为实际上,我的任务是用类似的功能替换第三方用户控件。此第三方控件在Sharepoint中使用,位于不同的程序集DLL中。这是排除的一件事:祝你好运事实上,你让我再次思考。这是一个第三方控件,您有它的源代码吗?有自己的.ascx文件吗?您可以检查.ascx文件上的BuildAction。您可以使用虚拟路径提供程序使用一些技巧,这些技巧允许您在多个项目中对.ascx文件重复使用用户控件。也许这些正在被使用。这个IIRC涉及将.ascx文件编译为一个资源。它不是第三方控件,而是我自己实现的控件,在哪里可以使用它应该没有限制。不幸的是,这不起作用
或者我。输出程序集已位于bin文件夹中,当我将其从该文件夹中移除时,加载页面时会出现异常,告诉我该程序集丢失。我尝试在assembly属性中使用完全限定名,但仍然没有任何结果…如果bin不起作用,那么您可能需要像这样将dll添加到GAC:并将其作为package中的依赖项添加到包中。package底部有一个高级选项卡:将其放入GAC,回收了应用程序池并重新启动了IIS,但仍然一无所获。很抱歉,这就是我在SharePoint方面的专长,我只有6个月的经验:祝你好运找到答案!也许你可以在我说的常规ASP.NET ascx控件上找到更快的人。我们还有另一个程序集,其中包含几个用户控件ascx,这些控件直接部署到Sharepoint解决方案的ControlTemplates文件夹中。DLL被加载到Sharepoint中,工作正常。我的问题是,我想用类似的方法创建一个新的程序集,尽管在我的DLL中,我也从用户控件中打开了aspx页面。不幸的是,我没有及时找到任何好的解决方案,我放弃了另一个解决方案的想法。我意识到这已经在对话中消失了。只是想展示这篇文章,说明ascx可以共享accross程序集。