在一个Record Center(记录中心)中,在编辑文档的属性时,点击“Submit(提交)”按钮的时候发生了什么

在一个record center的Drop Off Library中,编辑一个文档的属性的界面,与其他的文档库有所不同,其中的“Save”按钮变成了“Submit”:

在一个Record Center(记录中心)中,在编辑文档的属性时,点击“Submit(提交)”按钮的时候发生了什么_第1张图片

而且点击Submit之后的行为也不一样了,普通的文档库直接跳转回文档库,但是Drop Off Library,执行了一个LongOperation的操作:

在一个Record Center(记录中心)中,在编辑文档的属性时,点击“Submit(提交)”按钮的时候发生了什么_第2张图片

然后转向了一个页面:

在一个Record Center(记录中心)中,在编辑文档的属性时,点击“Submit(提交)”按钮的时候发生了什么_第3张图片

这个页面其实是通知用户,这个文档会根据管理员设定的策略,被转移到其他的文档库中。具体如何配置record center和文档传送的规则(Route Rule)请参考微软官方文档。这里想说的是,这个submit的过程,SharePoint到底做了什么?

我们知道,SharePoint的属性编辑表单(EditForm)与一般的application page不同,并不是在layouts目录下,而是保存在数据库中的,在用户请求的时候,通过ListFormWebPart来展示。如果使用SharePoint desiger打开这个页面,就可以看到ListFromWebPart:


在reflector中,找到ListFormWebPart的定义,可以发现在它的CreateChildContorls()方法中,使用了Template:


常用的模板都是在15\Template\CONTROLTEMPLATES文件夹下的“DefaultTemplate.ascx”这个用户控件中定义的,但是Drop Off Library的模板并没有定义在这里,而是在另外一个用户控件中,这个控件的名字是“DropOffZoneRoutingForm.ascx”,打开这个控件,可以找到“Submit”按钮的定义,可以看到,这个按钮是一个名字叫“RouteFileButton”的Control:


这样就找到了这个“Submit”按钮的对象,这个RouteFileButton是在Microsoft.Office.RecordsManagement.Controls命名空间下的一个button,这个命名空间在“Microsoft.Office

.Policy.dll”中。同样使用reflector打开它,可以看到如下方法,其中的“SaveItem()”方法就是我们要找的方法:


具体的代码可以使用reflector查看,这里简单说一下这个SaveItem()做的事情:

首先根据当前站点,初始化一个RoutingWeb,这个对象用来处理文档的传送(Routing),并且判断当前的站点是否启用了routing:

EcmDocumentRoutingWeb routingWeb = new EcmDocumentRoutingWeb(SPContext.Current.Web);
... ...
if(routingWeb.IsRoutingEnabled)

如果启用,那么会检查当前文档是否被签出,是否需要审批。如果文档是签出状态,就要先签入文档:

... ...
SPListItem routeItem = SPContext.Current.ListItem;
......
SPFile file = routeItem.File;
... ...
if (file.CheckOutType != SPFile.SPCheckOutType.None)
{
    file.CheckIn(string.Empty);
}
如果文档需要审批,当前用户又有审批的权限,就先审批文档,
... ...
if (enableModeration && routeItem.DoesUserHavePermissions(SPBasePermissions.ApproveItems))
{
    file.Approve(string.Empty);
}
... ...

然后启动一个longoperation的操作,来执行文档的流转:

using (SPLongOperation operation = new SPLongOperation(this.Page))
{
    ... ...
    routeSucceeded = web2.Router.RouteFileToFinalLocationNowAsSystem(itemToRoute, web, currentUser, string.Empty, out routeDestination, out externalRouteResult);
    ... ...
}

最终执行的方法是“RouteFileToFinalLocationNowAdSystem”,这个方法负责根据配置的传送规则(routing rule),将文档传送到其他的文档库。

这个方法的返回值是一个bool类型的值,如果是true,说明这个文档被传送的其他的文档库了,如果是false,说明这个文档没有被传送到其他的文档库。

这个方法还有两个out 参数,routedDestination是指文档的URL,就是传送完毕之后,页面上显示的URL,通过这个URL可以直接找到文档(即使没有传送到其他的文档库,也是有这个URL的);另一个参数是externalRouterProperties,这个参数包含了传送的结果信息,其中的OfficialFileResult包含了很多有用的信息,

在一个Record Center(记录中心)中,在编辑文档的属性时,点击“Submit(提交)”按钮的时候发生了什么_第4张图片

以上就是点击“Submit”按钮之后SharePoint执行的一些操作,记录下来备忘。

你可能感兴趣的:(code,record,SharePoint,Routing,center,Behind,文档中心)