RSS

Monthly Archives: 十一月 2004

一个示范性的文档库结构TreeView WebPart

一直都有朋友问我如何将整个站点的文档库的结构通过一个TreeView展现出来。昨天抽空把它做出来了,使用了两个Part,第一个Part以一个TreeView的方式,展现出站点整个文档库和下面所有子文件夹的结构,第二个Part根据第一个Part点击选择的文件夹目录,展现出那个目录下的文件列表。

下面是将两个Part连接起来:

选择第一个Part中的文件夹节点后,第二个Part就会将选中文件夹中的文件列表展现出来了。

Part中的TreeView是直接使用的Microsoft IE WebControls里面的TreeView控件。两个Part都是基于我的UserControl Wrapper来做的,就是说,两个Part实际上都是标准的ASP.NET用户控件(.ascx和.ascx.cs文件)。UserControl Wrapper可以使WebPart Connection的开发非常简单,已经不需要再了解WebPart Connection的机制就可以直接开发出可以传递数据的WebPart了。

如果有需要的朋友,可以在这里下载这两个Part的源码后参考一下,然后根据自己需要的样式和功能进行修改。

 

Posted by on 2004/11/29 in 未分类

33 Comments

Tags:

Delphi2005第一印象

Borland已经在站点上提供了Delphi2005试用版的下载。我也尝试着安装了,希望能够初步体验一下Delphi2005。

安装的时候,可以选择Delphi.NET、Delphi Win32和C# Builder这三个可选组件,可见Delphi2005给它们提供了一个集成的开发环境。

这是启动后的界面,和Delphi8还是非常相似的。

代码编辑器还是很类似传统的Delphi风格,但是显然更加人性化了一些。当我们选择一个成员的时候,智能提示可以告诉我们更多的信息,比如窗体上某个控件是在代码文件的第几行定义的。

项目类型基本上按照Delphi.NET、Delphi Win32和C#这三块来划分。由于这三块的差别显然不仅仅是语言上的差别,所以各自的项目类型都有差异,和VS.NET中的C#、VB、C++那样的划分大不相同。

赶紧体验一下Delphi2005集成的重构功能,但比较失望,因为重构项目的数量和我想象中相差不少。

同样,集成的单元测试功能,可以自动为某个窗体或者某个类来创建一个Test Case类文件。Delphi2005同时支持DUnit和NUnit这两个Framework。

Model Diagram也非常类似Together.NET

总体感觉:
IDE稳定性不错,在体验的过程中,没有出现任何Crash的情况,比Delphi8好很多。但是Delphi2005并没有给我“惊喜”的感觉,就是说,似乎它没有什么特性能够吸引我有在下一个项目中使用Delphi2005的冲动。代码编辑器对于习惯Delphi的开发人员来说没任何问题,但是对于习惯VS.NET的开发人员来说,总觉得不如VS.NET的代码编辑器顺手。ECO似乎是它的一大亮点,但是缺少“唾手可得”的优秀文档阻碍了开发人员进一步熟悉和使用它。

Delphi2005能够吸引到已经使用VS.NET进行.NET开发的开发人员吗?可能性很小。两种开发环境风格大相径庭,熟悉了任何一个开发环境的开发人员都会“自然”的对另一种环境风格产生“排斥”的心理。

Delphi2005能够吸引到现有的Delphi程序员投入到.NET开发中吗?难度很大。Delphi各个版本间的兼容性一直都是开发人员比较头疼的问题,这也是为何现在使用Delphi5的开发人员依然不少的原因。虽然Delphi2005内置了Delphi Win32开发平台,但它相对Delphi7(或者5、6)的升级兼容性不得而知。进入.NET世界?不少Delphi程序员都把这条道路看作“堕落”的表现,并表示出“与Delphi5(或者6、7)共存亡”的决心(“思想才是重要的”这一时髦用语也成为重要论据之一)…

 

Posted by on 2004/11/22 in 未分类

38 Comments

Tags:

SharePoint Portal Server 2003书籍计划最新进展

出版一本SharePoint Portal 2003方面的书籍的计划已经筹划很久了。最近,这个计划有了比较大的进展和变化。

1、此书的出版商将为电子工业出版社,运作公司是博文视点
2、书的作者除了我之外,还会有我的同事熊明峰。他是微软公司SharePoint产品技术专家,在SPS 2003的架构规划、部署、定制、管理等方面都有着非常丰富的经验。
3、由于有了熊明峰的加盟,书的内容也将大幅增加,除了涉及到开发方面的内容之外,还将包含SPS2003的安装部署、Portal的组织结构规划、管理配置等内容。
4、我计划的交稿时间是在春节前,我会争取在预定时间内完成书稿的内容。
5、现在书的正式名称还没有定下来,我想知道大家有何建议?《Microsoft SharePoint Portal Server 2003 宝典》?好像有点俗…

书最新的目录、大纲(在出版商允许的情况下)我会在Blog上陆续公开。希望大家也能留下对书的内容的建议、想法。

 

Posted by on 2004/11/18 in 未分类

131 Comments

Tags:

ASP.NET 2.0 Beta2中页面编译模型的变化

孙展波的Blog中已经描述了对于特殊目录,Beta2相对Beta1所做出的调整。除此之外,Beta2的编译模型相对Beta1也会做一个相当大的修改。

首先回到ASP.NET 1.1的“远古时代”,看看ASP.NET引擎是如何处理页面文件和Code-Behind文件的。

我们在页面文件的上方通常会看到这样一句声明:

<%@ Page CodeBehind=”Default.aspx.cs” Inherits=”WebApplication1.CDefault” %>

当我们在页面文件上加入一个新的ASP.NET控件时,VS.NET自动会在Code-Behind代码文件中增加一个protecte的对象声明,并在代码中使用和操作这个对象。VS.NET会时刻维护页面文件中的控件与代码文件中的控件对象声明之间的同步。

当我们编译站点时,VS.NET将所有Code-Behind文件编译在一起,生成一个位于/bin目录中的.dll文件。然后,我们将所有的页面文件和/bin部署到服务器上。当用户浏览页面文件时,ASP.NET引擎自动根据页面中的内容,生成一个.cs的类文件,并根据页面文件头部声明中的“Inherits”所指定的内容,让这个类从指定的父类继承下来。这样,页面就和后台代码文件中的内容通过“继承”的方式结合在了一起。

这种页面编译模型最大的问题,就是页面中的控件,必须时刻与Code-Behind中的控件对象声明保持同步,虽然开发人员“意识”不到这一点,但是如果VS.NET出错而未能同步,就会损坏这种通过“继承”来连接的关系。

OK,在ASP.NET 2.0 Beta1中,我们终于可以用更加优雅的方式来实现了页面文件和Code-Behind文件的分离和连接了。由于有了partial class这个新的语言特性,我们终于可以摆脱巧妙、但“笨拙”的继承连接关系。为了体现Beta1中后台代码文件的特点,我们干脆直接把后台代码文件叫Code-Beside文件。

在页面文件的顶端,会如下面所示范的这样做一个声明:

<%@ Page Language=”C#” CompileWith=”Default.aspx.cs” ClassName=”Default_aspx” %>

注意,VS.NET在开发时不会给我们提供一个手段,把所有的Code-Beside文件都编译到/bin里面的一个.dll中。

部署时,我们直接把所有的页面文件和Code-Beside文件直接XCopy到服务器上。当用户浏览页面时,ASP.NET引擎自动根据页面上的内容,生成一个partial类,然后与Code-Beside中的partial类整合在一起,最后完成编译。这个编译过程(页面文件和Code-Beside)完全是在运行时动态完成的,如果我们修改了页面文件或者Code-Beside文件,都不需要做任何手工操作,ASP.NET引擎会自动在下次浏览时重新进行编译动作。

嗯,当然,很多人会觉得不爽,“为啥我要把后台代码文件也给部署上去呢?”所以,ASP.NET Beta1也提供了其他的编译部署方案,比如,把整个站点的所有内容,包括页面文件和Code-Beside文件统统编译成一个.dll,然后部署到服务器上。

最后,终于,我们可以来看看ASP.NET Beta2中,页面编译模型又发生了什么变化。

页面文件顶端的声明变成了如下所示:

<%@ Page CodeFile=”Default.aspx.cs” Inherits=”Default_aspx” %>

怎么样?看到“Inherits”,是不是怀疑又走回ASP.NET 1.1的老路了?对,也不对。

当使用VS.NET创建一个页面的时候,VS.NET会自动创建一个Code-Behind(我们重新用回Code-Behind这个词)文件,当我们在页面上增加一个控件的时候,VS.NET如同Beta1一样,并不会在Code-Behind中增加一个什么声明。但是,当我们编译站点的时候,VS.NET自动根据页面文件的内容,生成一个“临时中间”partial类,然后把这个partial类和Code-Behind中的partial类整合编译,最终生成一个位于/bin中的.dll文件。

部署时,我们如同ASP.NET 1.1中一样,把/bin和所有页面文件部署到服务器上。当用户浏览页面时,ASP.NET引擎根据页面内容生成一个类文件,然后根据文件头部声明的“Inherits”的值,让这个类文件从指定的父类继承下来,最后完成编译过程。

总之,Beta2的页面编译模型吸收了ASP.NET 1.1和ASP.NET 2.0 Beta1的优点,我们既可以把站点的所有后台代码编译好,然后和所有页面文件一起部署,也获得了Beta1中,开发时后台代码文件中不需要另外声明页面控件对象的好处。

当然,对于开发人员来说,这一切都是在“盖子”底下运作,我们不需要了解这些,就可以方便的进行开发。

微软会在11月份推出一个新的社区技术预览版(CTP),将会体现所有的这些变化。Beta2预计会在明年年初发布,Beta2的设计基本上延续到RTM。

更加详细的信息,请参考MSDN上的这篇文章

 

Posted by on 2004/11/18 in 未分类

11 Comments

Tags:

操作SharePoint Object Model完成两项操作的文档

下面的文档原本是我写给客户作为开发参考的,觉得应该也有不少朋友会觉得需要,所以贴出来。文档中说明了如何完成两种编程操作:管理站点中的角色和用户、管理文档库的权限授权。

另:我的那本《SPS2003开发指南》已经基本定由电子工业出版社出版,我的交稿时间会争取在春节之前,也就是约三个月后。没办法,工作比较忙,我又比较懒,辜负大家的期望了。大家觉得定价多少比较合适呢?:)

一、操作站点角色

 

核心类:

SPUser:表示一个站点用户(http://msdn.microsoft.com/library/en-us/spptsdk/html/tscSPUser.asp?frame=true

SPUserCollection:表示包含多个用户的集合(http://msdn.microsoft.com/library/en-us/spptsdk/html/tscSPUserCollection.asp?frame=true

SPRole:表示一个角色对象(http://msdn.microsoft.com/library/en-us/spptsdk/html/tscSPRole.asp?frame=true

SPRoleCollection:表示包含多个角色的集合(http://msdn.microsoft.com/library/en-us/spptsdk/html/tscSPRoleCollection.asp?frame=true

 

SPWeb(表示一个站点)包含一个Roles属性(SPRoleCollection类型),表示站点中所有的角色。SPRole包含一个Users属性(SPUserCollection类型),表示角色中所包含的所有用户。SPUser包含一个Roles属性(SPRoleCollection属性),表示用户所从属于的所有角色。

 

SPRoleAdd()方法用于将某用户加入到自身这个角色中。RemoveUser()方法用于将某用户排除出自身这个角色。更改一个角色的信息后,调用Update()方法更新回数据源。

 

下面代码示例遍历当前站点下所有的角色,然后遍历每个角色中的所有用户。由于每个用户可从属于多个角色,所以输出的用户信息会有重复。

 

foreach(SPRole role in SPControl.GetContextWeb(HttpContext.Current).Roles)

{

      Response.Write(“角色” + role.Name + “包含成员:”);

      foreach(SPUser user in role.Users)

{

Response.Write(user.Name + “;”);
}

      Response.Write(“<br>”);

}

 

二、操作文档库权限

 

核心类:

SPList:表示一个列表,文档库也是一个列表。(http://msdn.microsoft.com/library/en-us/spptsdk/html/tscSPList.asp?frame=true

SPPermission:表示一项授权(http://msdn.microsoft.com/library/en-us/spptsdk/html/tscSPPermission.asp?frame=true

SPPermissionCollection:表示包含多项授权的一个集合(http://msdn.microsoft.com/library/en-us/spptsdk/html/tscSPPermissionCollection.asp?frame=true

SPRights:用来表示权限的枚举(http://msdn.microsoft.com/library/en-us/spptsdk/html/tsenSPRights.asp?frame=true

 

SPList有一个Permissions属性(SPPermissionCollection类型),表示这个列表上所有的授权。每个SPPermission对应为一个被授权成员(可以是一个角色或一个用户)与某些权限。SPPermissionMember属性(SPMember类型,是SPUserSPRole的父类)对应此项授权的被授权成员,PermissionMask属性(SPRights类型)对应此项授权的权限。

 

SPPermissionCollectionAdd()方法用来增加一项授权,Remove()方法用来删除一项授权。

 

下面的代码示例遍历站点中的所有文档库,并查看用户“kaneboy”在每个文档库上有哪些权限,如果用户在某文档库上没有任何权限,则增加一项能查看文档库中文档的权限。

 

SPWeb web = SPControl.GetContextWeb(HttpContext.Current);

SPUser user = web.Users[“kaneboy”];

SPListCollection lists = web.GetListsOfType(SPBaseType.DocumentLibrary);

foreach(SPList list in lists)

{

      Boolean bIncludeMember = false;

      foreach(SPPermission perm in list.Permissions)

{

      if (perm.Member.ID == user.ID)

{

      bIncludeMember = true;

Response.Write(“在文档库” + list.Title + “上,用户” + user.Name + “的权限是:” + perm.PermissionMask.ToString() + “<br>”);
}

}

if (! bIncludeMember)

{

      list.Permissions.Add(user, SPRights. ViewListItems);

}

}

 

Posted by on 2004/11/17 in 未分类

22 Comments

Tags:

一个给文档评分的WebPart

昨天为了给一位客户做演示,做了一个给SharePoint文档库中的文档进行评分的WebPart。安装以后,直接把这个WebPart拖到文档库界面上,然后设置一下它的属性:

设置完成以后,文档的下拉菜单会多出一项:

用户只需要直接选择这个菜单项,就可以在弹出的提示框中填入分值,填写的分值大小必需在设置中所设定最小值和最大值之间:

然后,WebPart会自动将用户填写的分值保存到设置中设定的“保存Rating数据栏”中,同时根据多个用户的评分,计算出平均值,并保存到设置中设定的“显示Rating值栏”中。设置中的“是否允许用户多次投票”这个选择项决定了一个用户是否能多次对同一个文档评分。

可以在这里下载这个WebPart的安装文件。

 

Posted by on 2004/11/12 in 未分类

14 Comments

Tags:

SharePoint的定制

不少朋友对SharePoint的页面定制能力颇有怨言,其实SharePoint站点中,对站点的定制能力是极强的,我们可以根据自己的要求,在FrontPage中直接修改现有的页面,或者从头创建一个新的页面。通过SharePoint的站点(区域)定义和网站模板,我们还可以很快的从定制的模版,来创建新的区域和网站。

关于SharePoint站点页面的定制,推荐大家阅读这篇文章,文章中有非常详细的说明和描述。如果你能了解SharePoint中的“Page Ghosting”机制,那么就可以对SharePoint的页面保存机制有更加清晰的了解。你可以通过阅读这篇文章来了解“Page Ghosting”。如果有时间,我也很愿意写一些关于SharePoint页面定制方面的文章。

我的同事MingFeng Xiong在上月的Partner Training上,也讲过一节精彩的关于SharePoint站点定制的Session,如果他允许:),我希望能将那节Session的Slide放上来共享给大家。(谢谢djsshow提供的一个很好的WebCast资源,我也不用再麻烦我的同事了:))

SPS的SSO大家可能都比较清楚了,他提供了一个用户应用程序凭证信息的存放地,通过访问SPS SSO相关的Object Model,就可以得到这些存放的信息。但是,SPS SSO似乎只提供了单纯的一种通过Object Model访问其信息的途径,而如果我们希望在非SPS站点,或者第三方程序中访问SPS中存放的SSO信息,就非常麻烦了。最近在进行一个SharePoint SSO相关的开发的时候,为了方便能在任何地点访问到SPS SSO的信息,我在SPS站点中增加了一个Web Service,来供调用者获取所需的SSO信息。这样如果要在WebPart之外的其他地方获取这个信息,可就方便多了。

另外,以前我说过的那个FlowLite,可以在这里下载到安装程序了。如果你对SharePoint文档库中的文档流转功能要求非常简单,可以用这个东西将就一下。:)

 

Posted by on 2004/11/10 in 未分类

24 Comments

Tags:

对于Office12的期望

Moslem写了一篇关于Office12的文章,我也想说一下对于Office12的展望和期望:

SharePoint V3
下一个版本的SharePoint预计将构建在ASP.NET 2.0之上,而且SharePoint V3中的WebPart也将基于ASP.NET 2.0中的WebPart Framework。对于开发人员来说,这是一个好消息。按照早已经公开的计划,各个WebPart版本之间的兼容性会是:

·ASP.NET 2.0中的WebPart将能被使用在SharePoint V3中
·现在SharePoint V2(SPS2003)中的WebPart将能被使用在SharePoint V3中
·ASP.NET 2.0中的WebPart将能被使用在SharePoint V2(SPS2003)的升级版本(SPS2003 SP2?)中。

InfoPath Form Server
应该是现在SPS2003中的表单库的继承和扩展。我希望InfoPath能在企业业务流程中担当越来越大的作用。同时我也希望下一个版本的InfoPath能更好的配合定制的WebService工作。

Office SmartClient
虽然“Office SmartClient”这个词汇已经越来越多的被开发人员所认识,但是我希望下一个版本的Office具有更好的编程接口。SmartDoc、SmartTag、IBF、InfoPath的确都是好东东,但是现阶段针对他们的开发的确是“晦涩”而“曲折”了。

 

Posted by on 2004/11/06 in 未分类

30 Comments

Tags: ,

如何在Web页面上直接打开、编辑、创建Office文档

有朋友询问如何在Web页面上做到像SharePoint中的效果一样,能直接激活客户端的Word来打开.doc文件,而不是类似直接点击.doc文档链接时Word在IE中被打开那样。想想这个问题应该很多人都会感兴趣,所以干脆写一篇blog来大致描述一下方法。

在安装Office2003以后,有一个ActiveX控件被安装到了系统中,这个控件位于“Program Files\Microsoft Office\OFFICE11\owssupp.dll”。通过这个控件,客户端页面上的JavaScript就可以激活本地的Office软件,来实现打开、编辑Office文档。(另,Office XP应该就已经包含这个ActiveX控件了。)

首先,用Script创建一个本地的对象:

openDocObj = new ActiveXObject(“SharePoint.OpenDocuments.2″); // 为了兼容Office XP,可以创建“SharePoint.OpenDocuments.1”

然后,调用openDocObj的相应的方法。比如打开服务器上的一个Office文档:

openDocObj.ViewDocument(“http://www.abc.com/documents/sample.doc”);

openDocObj对象会根据参数中不同的Office文档类型(.doc、.xls、.ppt)来打开不同的程序(Word、Excel、PowerPoint)。ViewDocument()方法还有一个重载签名,可以让我们手工指定激活哪个程序来打开文档:

openDocObj.ViewDocument(“http://www.abc.com/documents/sample.doc“, 要激活的程序的ProgID);

那么要打开Office程序在线编辑文件又如何?

openDocObj.EditDocument(“http://www.abc.com/documents/sample.doc“);

就可以直接激活Word,在Word里面编辑文档,然后直接点击Word里面的保存功能,就可以将文件保存会服务器上了。注意:为了让Word能将编辑后的文档直接保存会服务器,访问Web站点的当前上下文的Windows Identity必须对服务器的相应目录(即“http://www.abc.com/documents”这个虚拟目录所对应的服务器上的物理路径)有相应的写权限,否则保存动作会失败。编辑完成后,EditDocument()会返回一个bool值,来反映编辑操作是否成功。

我们还可以通过打开服务器上的一个文档模版,来创建一个新的文档:

openDocObj.CreateNewDocument(“http://www.abc.com/documents/sampleTemplate.dot“, “http://www.abc.com/documents/“);

就可以使用“http://www.abc.com/documents/sampleTemplate.dot”这个模版来创建一个新的文档,默认新文档的保存地点是“http://www.abc.com/documents/”。创建新文档时使用的程序取决于模版文件的类型(比如.dot模版会对应Word)。新文档的保存同样需要注意权限问题。CreateNewDocument()方法同样会返回一个bool值来反映操作是否成功。

CreateNewDocument()方法的第一个参数,除了可以使用一个模版的地址外,还可以直接指定为希望用来创建新文档的客户端程序的ProgID。

 

Posted by on 2004/11/03 in 未分类

124 Comments

Tags: ,