2008年3月16日,星期日

构建SharePoint网站时要注意的强大控件

我一直想做的事情是讨论一些我发现在将SharePoint网站组合在一起时有用的控件。显然,在为特定行为构建自定义控件之前,最好检查一下SharePoint是否附带有任何可以完成这项工作的东西。有时您会发现惊讶!当然,那些来自Content Management Server背景的人会熟悉在团队中拥有许多可重用控件(使用CMS API)的想法,但是在MOSS中,一些等效控件是免费提供的。最明显的是Content by Query Web部件(尽管我们不会提到如果没有额外的工作就无法访问输出HTML [符合WCAG AA]),但是一些较小的控件也需要引起注意。因此,以下是该工具箱中一些方便的项目:

SPSecurityTrimmedControl

此控件可用于有选择地显示内容或控件,具体取决于当前用户的SharePoint权限。因此,如果用户没有指定的权限,则不会显示控件的内部内容。一个例子是:

   1: <SharepointWebControls:SPSecurityTrimmedControl runat="server"  权限 ="ManageWeb">
   2:     This is only visible to users who can manage current web..    
   3: </SharepointWebControls:SPSecurityTrimmedControl> 

除了 权限 上面显示的属性(枚举), 权限 String 属性可用于指定逗号分隔 清单 所需的权限。可以与 权限模式 需要的财产 '所有' 要么 '任何' ,以及PermissionContext属性,该属性指定了指定权限适用于哪些SharePoint对象(例如'CurrentList','CurrentFolder','CurrentItem','CurrentSite','RootSite'),因此非常灵活。可以指定的权限示例 包括“ ManageLists”,“ AddListItems”,“ ViewPages”,“ ManagePermissions”和 以此类推。这些是 SPBasePermission 枚举和 Zac Smith有完整列表。值得注意的是,其中的许多权限在协作方案中可能比WCM更有用。 [UPDATE: 文本 in this section updated following comment below/further testing:] 对于WCM人士而言,该控件的确看起来像在对身份验证类型进行过滤方面有所帮助-不幸的是,此方法无法像宣传的那样起作用。供参考(如果MS对其进行了修复),用法是:


   1: <SharepointWebControls:SPSecurityTrimmedControl runat="server" AuthenticationRestrictions="AnonymousUsersOnly">
   2:     This *should* be visible only to anonymous users but it doesn't work..    
   3: </SharepointWebControls:SPSecurityTrimmedControl> 

如您所料,此处的有效值为“ 匿名 UsersOnly”,“ AuthenticatedUsersOnly”和“ AllUsers”-但是,如下面的注释中所述,“ AuthenticatedUsersOnly”是唯一看起来正常工作的标志。

还有其他一些有趣的属性:

  • PagesMode-有效选项为“设计”,“全部”和“正常”

  • QueryStringParametersToInclude

  • 必需功能

这些 例如需要过滤的其他属性,但是我也无法使它们起作用。我的调查能力让我失望了,因为将Reflector触发到SPSecurityTrimmedControl和相关的RightsSensitiveVisibilityHelper类上并没有带来任何用处,Google或搜索这12个配置单元也没有。当然,看起来值是后两个参数所需的全部,但我并不高兴。但是,对SPSecurityTrimmedControl的最后考虑是通过以与SPLinkBut​​ton相同的方式从此控件派生而打开更多可能性的想法。

EditModePanel

在先前的控件检查用户的权限以确定是否应显示内容的位置上,EditModePanel会查看当前页面是处于显示模式还是编辑模式。在WCM世界中,当用户编辑页面时向用户显示帮助消息或其他内容时,这可能非常有用。但是,还有其他用途-隐藏导航,添加内联CSS覆盖类以使用不同的格式(特别有用)以及在HTML输出中发出调试信息都是示例。该控件的声明如下所示:

   1: <PublishingWebControls:EditModePanel SuppressTag="false" GroupingText="Title help" 
   2:         PageDisplayMode="Edit" runat="server" id="EditModePanel1">
   3:     Page 标题s should be concise
   4: </PublishingWebControls:EditModePanel>

在编辑模式下运行时,它看起来像:


 EditModePanel

更漂亮的用法可能是将字段控件包含在每个各自的EditModelPanel中,这意味着输入控件显示在框的边框内。为此,我们还需要将额外的EditModePanel设置为PageMode = "Display"由于原件将仅在编辑模式下显示,因此该控件还包含字段控件。注意此控件将输出一个周围<div>除非SuppressTag属性设置为“ True”。

ListItemProperty

您可以与以前的控件一起使用的一个控件是ListItemProperty控件。这个简单的小家伙可以让您为列表项写出特定字段的值。呈现的字段是通过Property属性指定的,我们在其中指定字段的内部名称。默认情况下,使用当前列表项(即用于我们正在查看的页面),但是可以通过指定List属性来覆盖它-为此,我们使用大括号指定列表GUID:



   1: < 的SharePoint WebControls:ListItemProperty runat="server" id="ListItemProperty1" 
   2:     List="{C110296D-2BE9-4818-80EE-A06BD018DE2F}" ListItemID="1" Property="Title"/>


我认为此控件是对所选字段的内容执行.ToString()。在WCM中,有时您希望此值显示在页面上与编辑值不同的位置(例如,在<title>标签。请注意,我们还可以指定 我们要使用ListItemVersion属性检索其值的列表项。

ListProperty

与ListItemProperty几乎相同,除了列表本身。这两个很可能一起使用,就像列表中DispForm.aspx中的代码一样:



   1: < 的SharePoint :ListProperty Property="LinkTitle" runat="server" id="ID_LinkTitle"/>
   2: : 
   3: < 的SharePoint :ListItemProperty id="ID_ItemProperty" MaxLength="40" runat="server"/>

This will show the current 清单 's 标题, followed by a colon, followed by the current 清单 item's 标题.


项目属性


名称有些混乱,但是此控件使我们可以写出当前站点/网站的某些属性。的 MSDN文档 显示有效列表为:

  • BlogCategoryTitle-当前帖子项目的类别

  • BlogPostTitle-当前帖子项目的标题

  • 描述-当前网站的描述

  • RecycleBinEnabled-如果启用了回收站,则为1;否则为0。否则为0

  • SiteOwnerName-当前网站集的所有者的用户名

  • SiteUrl-当前网站集的完整URL

  • 标题-当前网站的标题

  • 网址-当前网站的完整URL
So the following would write out the 标题 of the current web:



   1: < 的SharePoint WebControls:ProjectProperty runat="server" id=" 项目属性 1" 
   2:     Property="Title" />

委托控制

此控件提供了一种体系结构,其中在页面布局/母版页上添加了“外部”控件,但“内部”控件由功能部件确定,因此可以换出该控件,而无需修改原始模板。这在Microsoft的母版页中得到广泛使用。这是一个很好的控件,我将在后面更全面地讨论 使用DelegateControl 发布。

AssetUrlSelector

为了完成一些稍有不同的操作,在开发自定义Web部件和现场控件时,此控件非常有用。它提供了使用SharePoint时作者习惯的“文件选择器”体验,并且在您具有需要选择文件的控件时非常适合。因此,在我的几个控件中,我允许用户覆盖用于格式化的XSL文件,并将AssetUrlSelector添加到我用于控件的编辑视图的用户控件中。这为我提供了“浏览”按钮,单击该按钮将启动选择器:


 AssetBrowseButton  
单击该按钮,然后显示:

 AssetUrlSelector  
AssetUrlSelector 提供了相当不错的用户体验,包括在当前选定文件的位置(如果存在)打开选择器,或者如果不存在则默认为指定的默认位置。同样,如果您需要提供平滑的体验来选择图像,则可以使用RichImageSelector-这是RichImageField控件使用的选择器。

概要

这就是我发现有用的一些控件。显然还有更多的堆栈,我强调过的堆栈可以用很多有趣的方式使用,这里不再讨论。但是希望这确实可以提醒您在花时间编写自己的东西之前先检查一下盒子中的内容!

17条评论:

匿名 said...

至少我没有忽略AutoIncrement的SharePoint列类型,因为它看起来似乎在SharePoint 2007中没有这种动物。

匿名 said...

非常有用的帖子,谢谢克里斯。您能推荐一下SDK或MSDN中的一个好地方来开始探索所有可用的发布控件吗?

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

太棒了,谢谢您的反馈Matt。不幸的是,某些控件的文档仍然很少-通常最好的办法是将控件拖到SPD中的模板上并开始探索属性-在该属性需要枚举的地方,IntelliSense应该可以帮助您解决问题。价值观。

但是,绝对值得检查文档,以防万一-此处列出的控件位于 Microsoft.SharePoint.WebControls 命名空间或 Microsoft.Sharepoint.Publishing.WebControls 命名空间-建议看看。

附言我注意到我的代码示例中的标记内容已经消失了-希望不会损失太多示例值,将尽快纠正:-)

威廉·普雷斯 说过...

克里斯很好。很有用!我正要扮演自己的SPSecurityTrimmedControl角色。

匿名 said...

我在这里列出了所有SPSecurityTrimmedControl标志
http://www.wssdemo.com/Blog/archive/2007/12/22/display-content-based-on-access-rights-much-easier-in-wssv3.aspx

You can also use the ddwrt:IfHasRights(permissionMask) function in any of the XSL based web parts (Data View, Content Query etc). See http://www.wssdemo.com/Blog/archive/2007/12/22/sharepoint-data-view-conditional-formatting-based-on-user-permissions.aspx

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

谢谢伊恩。非常喜欢XSLT中ifHasRights()的技巧:-)

匿名 said...

非常不错的文章,但是我有一个问题:是否可以在其中安装带有Control的功能,该功能以这种方式工作,即在渲染自身后“调用”具有下一个Sequence值的委托控件?

匿名 said...

克里斯:

希望您仍在检查此博客。感谢您提供的丰富信息,但是在使用授权模式时,使用SPSecurityTrimmedControl时遇到问题。例如:

SharepointWebControls:SPSecurityTrimmedControl runat =“ server” 权限 string =“ Anything”

效果很好,我是为匿名用户与经过身份验证的用户这样做的,并显示了特定的Web部件区域。但是,当我尝试这样做:

SharepointWebControls:SPSecurityTrimmedControl runat =“ server” AuthenticationRestrictions =“ 匿名 UsersOnly”

还是AuthentictedUsersOnly,无论哪种方式,它似乎都无法正常工作。我基本上需要显示和隐藏Web部件(如果您是匿名用户或已授权用户,并且权限字符串可以正常工作),但是我无法通过AuthenticationRestrictions起作用,有什么想法吗?我正在围绕WebPartZones的页面布局中进行此操作,它是一个子网站集,但我看不出这有什么关系--为什么权限会起作用但AuthorizationRestrictions却不起作用?我已经和这个战斗了一段时间了。例如,我知道用户未通过身份验证,因为当他们单击列表时,系统会提示他们登录并通过使用PermissionString属性时具有的“受限访问”角色来显示用户。

有什么帮助或想法吗?

很棒的文章,并保持良好的工作。

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

你好

您应该能够在代码yes中使用DelegateControl -您将设置'ControlId'属性并调用Render()或RenderChildren()方法来获取输出。

但是,我认为您不能随意设置顺序-控件将自动以最低的顺序加载已为此ID注册的控件,而这就是您要呈现的控件。

HTH,

克里斯。

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

@马丁,

我刚刚回过头来使用SPSecurityTrimmedControl的'AuthenticationRestrictions'属性进行检查。有趣的是,我看到了与您相同的行为-对于经过身份验证的用户来说效果很好,但对于匿名用户却没有任何输出。

恐怕好像是控件中的错误:-(

HTH,

克里斯。

匿名 said...

谢谢克里斯:

在这一点上,我对MOSS不知所措。我有办法解决这个问题,最终,我需要一种基于身份验证状态显示和隐藏的方法。

因此,我创建了自己的webcontrol / compositecontrol,并使用了ParseChildren(false),然后没有根据身份验证状态呈现子控件。

虽然我的实现和设计效果很好,但现在SPD(SharePoint Designer)已经破坏了聚会:(。由于任何原因,如果我将WebPartPages:WebPartZone除了SPSecurityTrimmedControl以外的任何形式都包装,它将不会在MOD UI的SPD中呈现。网络或浏览器工作正常。

但是,我们在SPD中进行页面布局,我们的设计人员需要通过它来访问页面--由于将区域包装在控件中时无法渲染区域,因此我们也无法做到这一点。

我已经通过反射器查看了SPSecurityTrimmedControl并完成了我能想到的一切,现在,如果您想在WebPartZones上执行WCM,我认为没有办法完成它而不会破坏UI或SPD。如果您很好奇,我从SPD得到的错误是

“ WebPartPages:WebPartZone无法设置属性ZoneTemplate”

让我发疯的是SPSecurityTrimmedControl可以包装WebPartZOne,但我无法在SPD中进行其他渲染...。

如果您或任何人想出一种可靠的方法来对Authenticated vs Anon的Web部件区域执行WCM,请告诉我。

感谢您的回复

马丁

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

嗨,马丁,

嗯,那是一个难题。我也只是通过Reflector进行了窥视,并且沿着与IDesignerEventAccessor相同的方式走了(我找到了您的新闻组帖子)。我认为您现在已经以与SPSecurityTrimmedControl相同的方式实现了此功能,而控件仍无法在SPD中呈现?

其他想法:-

-大会是否在GAC中,所以我们知道这不是许可问题?
-您是否曾尝试在SPD运行控制代码时单步执行代码?您需要在此处附加SPD进程,而不是w3wp.exe。

HTH,

克里斯。

匿名 said...

克里斯,

Can you get the 内容类型 name in a ListItemProperty control from the NewForm?

如果是这样,怎么办?

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

@山姆

目前无法尝试使用此功能,但您是否尝试过使用'ContentType'作为Property属性的值?据我所知,这应该起作用,因为每个SharePoint列表都有一个如下定义的字段:

<FieldRef Name="ContentType" StaticName="ContentType" 显示Name="Content Type" Type="Text" />

希望它对您有用-让我知道。

干杯,

克里斯。

匿名 said...

克里斯,

看起来您可以在Edit(我假设是View)中使用ContentType,但不能使用New。我猜它要求存在要查询的数据。尽管它无法对QueryString中的ContentTypeId进行查找,但让我感到奇怪。

如果遇到其他问题,我会通知您,但我想我必须变得有点邪恶,并嵌入自定义控件才能完成工作。

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

@山姆

是的,我敢打赌你是对的,需要在后台进行查询的数据是正确的。

祝您横向思考好运:-)

C。

匿名 said...

克里斯(Chris)很棒的文章,只是一个问题,如果您想在页面上输出查找列表字段的值,您使用什么控件?