2007年6月20日,星期三

使用委托控件

当开始构建MOSS网站时,许多开发人员将通过分析随附的母版页和/或使用 “如何创建最小的母版页” MSDN文章。尽管非常有用,但为简单起见,不幸的是,本文中的示例未包含SharePoint团队在default.master中实现的某些功能,特别是对页面加载控件使用委托控件。我认为这很遗憾,因为许多不花时间专门研究它的开发人员可能因此不知道Delegate 控制的强大功能。

那是什么

本质上,委托控件提供了一种替代方法,可以以常规方式将用户控件和服务器控件添加到.aspx页。通过这种方式,我的意思是通过从开发环境中的工具箱中拖动或通过手动添加适当的标记来将控件添加到页面。相反,使用Delegate 控制,我们要做的就是添加标记以实例化Delegate 控制实例,然后 使用功能 分别指定应实际加载的控件。这有效地为我们提供了控制页面上使用哪些控件的功能,而无需直接修改和重新部署母版页/页面布局。这种额外的抽象级别可能非常强大,因为任何 功能范围 可以与委托控件一起使用。我会回到这一点,但到目前为止还没有足够的理论。使用方法如下:

首先,我们需要在页面上使用Delegate 控制声明。看起来像这样:

<SharePoint:DelegateControl 暴动="服务器" 控制Id="页头">

</SharePoint:DelegateControl>


在此阶段,唯一需要注意的是ControlId属性-我们创建的功能将使用它来替代实际的用户/服务器控件。

然后,我们有了feature.xml文件,在其中指定功能详细信息(包括作用域):

<特征 xmlns="http://schemas.microsoft.com/sharepoint/" ID ="373042ED-718D-46e2-9596-50379DA4D522"

标题="COB.Demos.DelegateControls"

描述="指定应该为网站母版页上使用的'PageHeader'DelegateControl使用哪个用户控件。替换用户控件存储在C中ONTROLTEMPLATES目录。" 范围="农场"

=""

="1.0.0.0">

<元素清单>

<元素清单 位置="elements.xml"/>

</元素清单>

</特征>


与往常一样,该功能的“指令”位于元素清单中:

<元素 xmlns="http://schemas.microsoft.com/sharepoint/">

<!-- 使用比默认值低100的序列号,以便加载我们的自定义控件 -->

<控制 ID ="页头" 顺序="90" 控制Src="〜/ _ControlTemplates / COBPageHeader.ascx" />

</元素>

这是我们指定实际使用哪个控件的地方。除了指定路径外,关键的是'Sequence'属性包含的值比其他任何值都低 <控制> 该控件的说明(即“ 页头”的ID)。当我们覆盖由Microsoft创建的现有Delegate 控制时,这一点尤其重要-这里的默认值为 100 所以你的顺序 必须 低于此值即可加载您的控件。

除了创建和激活此功能外,实际的.ascx文件还必须存在于指定的位置。可以将其手动复制到CONTROLTEMPLATES目录,但是更好的主意是将该功能包装为解决方案,因为解决方案包也可以部署文件。要将.ascx文件与解决方案一起部署,您的解决方案清单文件应类似于:

< xmlns="http://schemas.microsoft.com/sharepoint/" 解决方案编号="E8694626-60F8-4d07-9140-8F9F634020DE">

<功能清单>

<!-- 注意,这是cab文件中的位置! -->

<特征Manifest 位置="COB.Demos.DelegateControls \ feature.xml" />

</功能清单>

<模板文件>

<模板文件 位置="CONTROLTEMPLATES \ COBPageHeader.ascx" />

</模板文件>

</>

现在,这些文件都将通过makecab.exe以通常的方式打包为解决方案(.wsp)。部署解决方案后,文件将被复制到服务器场中所有Web前端的正确位置,并且激活该功能后,SharePoint将知道此后应使用以下任何控件为它加载“ COBPageHeader.ascx” ID为“ 页头”。

那有什么好呢?

好吧,有两件事:-

  • 现在,我可以覆盖页面应加载的控件,而无需返回,编辑模板并重新部署
  • 通过使用范围为“ Web”的功能,我可以有效地在网站的不同区域使用不同的页面标题,而无需使用不同的模板或代码。 (请注意,我尚未对此进行广泛的测试,但是自从 <控制> 元素可以在范围Web,站点,WebApplication或Farm中使用,这应该是完全可行的。)
  • 我可以使用任何标准的.Net用户控件或服务器控件,因此对于熟悉Jan Tielen的SmartPart的任何人,它都提供类似的功能。

在功能方面,我还要强调两点:

  • 可以通过页面上的声明将参数传递给控件。要阅读这些内容,控件的实现应在控件树上遍历以获取值。一个例子是:
  • <SharePoint:DelegateControl 暴动="服务器"

    控制Id="页头" MyParam="我的价值">

    </SharePoint:DelegateControl>

  • 通过增加 允许多人="真正" 在声明中,您可以使Delegate 控制加载多个用户/服务器控件。
  • 如前所述,default.master上使用的许多控件都是使用“委托控件”加载的。这些包括全局链接,例如“我的网站/我的链接”和发布控制台。因此,使用此方法,自定义发布控制台是提供替换.ascx并按此处所述创建功能的简单问题!

希望这对为什么您应该考虑在模板上使用它提供了一些见解。最终想想,如何与Web部件组合在一起,以便您可以简单地将现有的ASP.Net用户/服务器控件重新用作Web部件?

16条评论:

西蒙说过...

克里斯

这不起作用:

<SharePoint:DelegateControl 暴动 ="服务器"控制Id ="页头" MyParam="我的价值">

Sharepoint会给您一个错误:

在处理/_catalogs/masterpage/GeneralContent.aspx时发生错误。键入“ Microsoft。 SharePoint.WebControls。 委托控制”没有名为“ MyParam”的公共属性。

我想念什么吗?我发现将参数传递给用户控件的唯一方法是使用DelegateControl的“ ID”属性。我真的希望这不是唯一的方法!

克里斯·奥'Brien说过...

嗨西蒙,

嗯,当我使用委托控件时,我认为还不需要传递参数。但您的举报令我感到惊讶- 委托控件的MSDN文档 当然提到能够做到这一点。

抱歉,我没有时间进行检查。我想知道是否只能将参数传递给服务器控件,而不是用户控件?

还有其他人这样做吗?

谢谢,

克里斯。

克里斯·唐兰说过...

克里斯

感谢您的帖子。

我有一个自定义的Web用户控件,正在使用委托控制进行加载,该委托控制具有代码。您知道如何将调试器附加到该代码吗?谢谢。

克里斯·奥'Brien说过...

克里斯,你好

好的,我还没有这样做,但是我认为这里有2种可能性:

-您可以通过将.pdb文件添加到GAC中,然后设置一个断点并正常使用调试器来执行此操作。看到我的帖子 如何调试SharePoint功能接收器 完整的摘要-它 应该完全一样。
-由于使用了反射,因此无法以这种方式调试委托控件的代码。

有兴趣听到结果!

干杯,

克里斯。

匿名 said...

克里斯,你好,好文章!我有一个问题:是否可以检查链中具有相同ID的下一个委托控件,并将其插入控件后的最大值。顺序?

克里斯·奥'Brien说过...

嗯,不确定我是否会严格遵循,但我认为答案并非不幸。据我所知,无法访问具有相同ID的其他委托控件-该控件将简单地加载具有最低ID的控件。

也许值得用Reflector快速检查一下,但:-)

HTH,

克里斯。

&走少了路说过...

克里斯

这个帖子很酷。你知道什么控件是左上角的导航控件,我可以使用委托控件添加亩自己的用户控件

克里斯·奥'Brien说过...

导航控件不是委托控件,它们被添加到您的网站使用的母版页的标记中。委托控件实际上用于导航控件的DataSource,但这是更微妙的事情!

在回答第二个问题时,您绝对可以将自己的用户控件与委托控件一起使用。希望上面的信息(特别是有关使用'ControlSrc'属性的信息)可以帮助您入门。

HTH,

克里斯。

匿名 said...

克里斯,您好,您自己也不需要将参数传递给DelegateControl。这意味着您从未尝试过。为什么然后在您的帖子中包含有关如何将参数传递给DelegateControl的信息?如上面的Simon所指出的,如果进行快速测试,就会发现这会使页面崩溃。

克里斯·奥'Brien说过...

嗨,达伦,

谢谢你的评论。我确实没有尝试过使用DelegateControl进行参数传递,这确实是正确的,而且当我在较早的笔记中这么说时,我也不认为它是“准入”。我将信息包括在我的帖子中是因为我没有尝试过这并不意味着它对于其他人开始查看控件不是有用的信息。显然,不幸的是,它并没有像宣传的那样起作用。也许我应该在该要点上加上“我还没有尝试过”,但是我并不是想表明我已经尝试过了。

对不起,您有不同的感觉。

克里斯。

匿名 said...

苔藓UMS
这不是理想的选择,但是要设置控件属性,这是您功能的elements文件:

<Control
ID =“ pagesCntrlId”
controlSrc =“〜/ _controltemplates / feature / cntrl.ascx”
顺序=“ 90”>
<Property Name="prop">propVal
</Property>
</Control>

我希望这可以帮助其他人更好地使用这些控件!

干杯,迈克 苔藓UMS.

汝池说过...

Nice post, it gives brief about delegate control + how to use properties. To know how to use properties please go through -http://msdn.microsoft.com/en-us/library/ms470880.aspx

匿名 said...

感谢您的文章。它使我大致了解了委托控件可以做什么以及为什么有用。

索拉卜说过...

克里斯。

我在Sharepoint中尝试过jQuery
我提到
http://weblogs.asp.net/jan/archive/2008/11/20/sharepoint-2007-and-jquery-1.aspx

http://weblogs.asp.net/jan/archive/2008/11/20/sharepoint-2007-and-jquery-2.aspx

我使用了委托控制方法。
我在controlTemplates文件夹中创建用户控件,创建功能,安装功能并激活功能,并将委托控件置于母版页上

>SharePoint:DelegateControl 暴动 ="server" 控制Id="AdditionalPageHead"AllowMultipleControls ="true" />

(我检查了我的elements.xml,我使用了相同的controlId,即AdditionalPageHead)

然后我创建一个aspx页面并放置一个锚标记,并且在单击事件时要显示警报("Hello World");

我的jQuery代码在aspx文件中。

<script type="text/javascript">
$((document).ready(function()
{
$('#anc').click(function()
{
警报("Hello World");
});
});
</script>

<a id="anc" href="#">Request</a>

它没有'工作。单击锚点时没有任何反应。

有任何想法吗?
亲切的问候。
索拉卜

克里斯·奥'Brien说过...

@Saurabh,

如果在加载页面时存在控件,则解决方案的“委派控件”部分可以正常工作。我不确定您是否100%肯定,建议您放入一些临时HTML,以便您进行验证。

一旦证明您可以控制 在那里,问题与委托控制无关,因此您应该查看其他位。害怕我不是jQuery专家,所以那里真的帮不上忙。

HTH,

克里斯。

JB说过...

克里斯,你好
我如何找出控件ID?我尝试使用反射,但没有帮助?另外,在editprofile.aspx页上,我们添加了一些额外的字段,我们需要一个委托控件来覆盖它以进行一些验证。

我正在使用Sharepoint2007。任何帮助将不胜感激。
最好的祝福
吉斯努