我们知道SharePoint 的Solution Schema里面有很多Element都是涉及到部署某个文件的,比如:
FeatureManifest
TemplateFile
ApplicationResourceFile
Resource
ClassResource
DwpFile
RootFile
Site definitions
但是这些文件到底会被部署到服务器的什么位置呢,在SDK中没有详细的说明,查了一下,具体应该是:
Features <FeatureManifest>:
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\
Template Files <TemplateFile>:
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\
Application Resources <ApplicationResourceFile>:
C:\Inetpub\wwwroot\wss\VirtualDirectories\{virtual app port}\resources
Global Resources <Resource>:
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\
Assemble ClassResource<ClassResource>:
C:\Inetpub\wwwroot\wss\VirtualDirectories\{virtual app port}\wpresources\程序集名称\
Web Parts <DwpFile>:
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\wpcatalog
Root Files <RootFile>:
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12
Site definitions:
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\SiteTemplates
参考自以下文章:
SharePoint Solution Manifests
Creating Advanced Solutions for SharePoint 2007
1.Overview SharePoint中的菜单都是基于ASP.Net 2.0的Menu和TreeView,这些控件生成的Html源码都是用table的结构,使得使用CSS控制菜单的样式不是很方便。
针对这个问题,网上有一个解决办法就是使用CSS Friendly Adapters(http://www.asp.net/cssadapters/ )可以让IIS中所有Web Site的Menu和TreeView菜单控件生成CSS友好的菜单结构,但是这种技术作用于整个IIS的所有网站。如果我在SharePoint中使用意味这整个服务器上的所有网站都会受到影响。
所以,为了灵活,我单独写了一个纯粹生成CSS友好的菜单结构的Web Control——CSSFriendlyMenu。使用方法和ASP.Net中的Menu控件一样,都是与一个SiteMapDataSource联合使用,大家可以到 这里 去下载Ipark.Web.WebControls.CSSFriendlyMenu试用。
Ipark.Web.WebControls.CSSFriendlyMenu是一个产生CSS友好的菜单的服务器端控件,较CSS Friendly Adapters灵活。
需与SiteMapDataSource控件联合使用。
CSSFriendlyMenu在SharePoint下的一个例子如下:
(红色框 就是由CSSFriendlyMenu生成的CSS友好的菜单结构)其结构形如:
2.Deployment
把dll部署到GAC($system\windows\assembly)中即可,此时在Visual Studio中即可在工具箱中找到。
如果在SharePoint中使用,请在对应的Web Application的Web.config的SafeControls节中添加
<SafeControl Assembly="Ipark.Web.WebControls.CSSFriendlyMenu, Version = 1.0.0.0, Culture = neutral, PublicKeyToken=064925da862cab62" Namespace="Ipark.Web.WebControls" TypeName="*" Safe="True" AllowRemoteDesigner="True" />
注: AllowRemoteDesigner="True"为了使在SharePoint Designer等设计器中可编辑。安装完成之后重启IIS,如正在用SharePoint Designer编辑页面,请重开SharePoint Designer方能正确使用。
3.Use
在页面顶端添加:
<%@ Register TagPrefix="Ipark" Namespace="Ipark.Web.WebControls" Assembly="Ipark.Web.WebControls.CSSFriendlyMenu, Version = 1.0.0.0, Culture = neutral, PublicKeyToken=064925da862cab62" %>
在页面中:
<Ipark:CSSFriendlyMenu ID="CSSFriendlyMenu" DataSourceID="topSiteMapDS" Direction="Horizontal " MenuLevel="2" runat="server"></Ipark:CSSFriendlyMenu>
<SharePoint:DelegateControl runat="server" ControlId="TopNavigationDS">
<Template_Controls>
<asp:SiteMapDataSource
ShowStartingNode="False"
SiteMapProvider="CurrentNavSiteMapProvider"
id="topSiteMapDS"
runat="server" />
</Template_Controls>
</SharePoint:DelegateControl>
注:本例中的SiteMapDataSource以SharePoint平台为例,除了CurrentNavSiteMapProvider外,SharePoint还提供了很多其他的SiteMapProvider,下次找机会介绍一下。
CSSFriendlyMenu包含两个主要属性:
Direction: Horizontal 或者 vertical,这个主要是控制输出的菜单外层的div的class的名称,便于在页面有多个CSSFriendlyMenu的时候,分别控制垂直和水平的Menu的CSS Style
DataSourceID:SiteMapDataSource控件的ID
MenuLevel:需要显示的菜单的层级,默认显示3级菜单
4.CSS Tag
设计CSS来定制菜单的显示样式,CSSFriendlyMenu生成的结构中使用的CSS class如下:
IparkCSSFriendlyMenu: root div
AspNet-Menu-Vertical: Vertical Menu root
AspNet-Menu-Horizontal: Horizontal Menu root
AspNet-Menu: root ul
AspNet-Menu-WithChildren: Submenu with children
AspNet-Menu-WithChildren-Current: Current Submenu with children
AspNet-Menu-Leaf: single Submenu
AspNet-Menu-Leaf-Current: Current single submenu
AspNet-Menu-Link: the link
<update>2008-3-23</update>
WSS 3.0中我们使用:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// implementation details omitted
});
可以提升代码的运行权限,实现模拟管理员身份的功能。
在RunWithElevatedPrivileges中不要使用SPContext.Current.Web,SPContext.Current.Site,SPControl.GetContextWeb(HttpContext.Current)之类的根据当前上下文得到当前的Web或者Site,根据这些方法得到的所有对象(包括从根据这些对象得到的List,ListItem等等对象)都是以当前网站登录用户权限运作的,即使是在RunWithElevatedPrivileges其运作权限也不会是管理员。
所以,如果要真正让在RunWithElevatedPrivileges中的代码以管理员权限正常运作的话,必须重新初始化相应的对象,比如:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite mySite = new SPSite(SPContext.Current.Site.Url))
{
Response.Write(mySite.RootWeb.CurrentUser.LoginName);
}
});
以上mySite.RootWeb.CurrentUser.LoginName返回的是管理员的登录帐号。
但是如果按之前所说使用SPContext:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
Response.Write(SPContext.Current.Web.CurrentUser.LoginName);
});
这时候即使在提升权限的范围内运行,得到的也是当前网站登录帐户名,而不是管理员登录帐号。
下面这个网站是在SharePoint中集成Silverlight的一个网站,包含了很多示例,值得一看!
http://www.ssblueprints.net/sharepoint/
包含下面一些例子:
1)Hello Silverlight Web Parts and the SilverlightPart
2)Silverlight Navigation Controls
3)Silverlight Social Networking Web
4)Visual How-To Center with Silverlight
5)Picture Viewer Sample
6)Silverlight Custom Field Types