如何将单独程序集中的用户控件添加到Sharepoint应用程序页面?

时间:2012-10-01 13:42:01

标签: asp.net sharepoint web-config sharepoint-2007 iis-6

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

背景: 目前我在一个项目中工作,我们的网络解决方案的一部分由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.构建,部署和Visual Studio标记很好。

问题: 部署到我们的测试环境后,在Sharepoint页面上根本不显示用户控件,我无法找出原因。

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

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

2 个答案:

答案 0 :(得分:0)

我认为您需要在GAC for SharePoint中注册您的dll才能找到它。我可能在那里错了,然后复制到bin目录就可以了。 但我非常确定您在注册时需要在Assembly属性中使用完全限定名称。

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

答案 1 :(得分:0)

我发布这个作为答案,因为尽管我们在评论中进行了交流,但我不确定你和我一直在谈论同样的事情。

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

因此,要替换的单独程序集中的第三方控件是Web自定义控件,或者 - 如果它在源中使用单独的标记文件 - 它必须使用技巧,例如虚拟路径提供程序诀窍,实现这一点。

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

还有其他选项,例如Virtual Path Provider解决方案,或来自Scott Guthrie(here)的着名选项。但最棘手的选择是将其编写为自定义控件。