查看特定文件版本



使用ithit-webdav服务器实现与 ASP.NET MVC4应用程序结合使用,我向用户表示几个Excel文档,可以打开并保存到webdav服务器,包括版本控制。编辑由 JavaScript 函数完成,该函数将处理对页面上文件网址的单击。对于IE,处理程序使用Sharepoint插件,否则使用winFirefoxPlugin。这一切都很好用。用户可以签出文件,编辑和保存文件,签入文件并增加版本号。但是现在用户应该能够显示文件的先前版本。我可以显示文件的所有现有版本的列表,但我不知道如何生成用户可以单击的链接以使用 javascript 处理程序打开文件。我唯一能想到的是在webdav服务器上创建一个包含特定版本的临时文件并打开临时文件(何时删除?
有人知道更好的解决方案吗?

var editDocument = function () {
  var $a = $(this),
     doc = $a.attr("href");
  var plugin = navigator.plugins["SharePoint.OpenDocuments"];
  if (!plugin) {
    try {
      plugin = new ActiveXObject('SharePoint.OpenDocuments');
    } catch (err) {
      //window.alert("Unable to create ActiveX object");
      //return false;
    }
  }
  if (plugin) {
    plugin.EditDocument(doc);
  } else {
    try {
      var ffPlugin = document.getElementById("winFirefoxPlugin");
      ffPlugin.EditDocument(doc);
    } catch (e) {
      alert("Editing not supported. (" + e.message + ")");
    }
  }
  return false;
};

版本 URL 完全取决于服务器实现。WebDAV 向导为 Visual Studio 生成的代码表单版本网址如下所示:

http://server/path/file.ext?version=1

要在JavaScript中获取客户端特定文件的文件版本列表,您可以使用IT Hit WebDAV Ajax库。File.GetVersionsAsync(( 方法返回一个 Version 对象的数组。每个版本对象都有一个 Href 属性,该属性是一个版本 URL:

var webDavSession = new ITHit.WebDAV.Client.WebDavSession();
webDavSession.OpenFileAsync('http://server/path/file.ext', function(oAsyncResultFile) {
        var oFile = oAsyncResultFile.Result;
        oFile.GetVersionsAsync(function(oAsyncResultVersions) {
                var aVersions = oAsyncResultVersions.Result;
                for(var i=0; i<aVersions.length; i++)
                {
                     console.log(aVersions[i].Href);
                }
            });
    });

如果您希望自己获取版本列表请求,以下是请求和响应的示例:

REPORT http://localhost:7865/DAV/qtest_1417713485047/Versions/ver.txt
Content-Type: text/xml; charset="utf-8"
<?xml version="1.0"?><version-tree xmlns="DAV:"><prop><displayname/><creationdate/><getcontenttype/><getcontentlength/><version-name/><creator-displayname/><comment/></prop></version-tree>
207 Multi-Status
X-Engine: IT Hit WebDAV Server .Net v3.9.2075.0 (Evaluation License)
Date: Thu, 04 Dec 2014 17:19:10 GMT
Content-Type: application/xml; charset=utf-8
Content-Length: 667
<?xml version="1.0" encoding="utf-8"?>
<d:multistatus xmlns:d="DAV:">
  <d:response>
    <d:href>http://localhost:7865/DAV/qtest_1417713485047/Versions/ver.txt?version=1</d:href>
    <d:propstat>
      <d:status>HTTP/1.1 200 OK</d:status>
      <d:prop>
        <d:displayname>ver.txt</d:displayname>
        <d:creationdate>2014-12-04T17:19:10Z</d:creationdate>
        <d:getcontenttype>text/plain;charset=UTF-8</d:getcontenttype>
        <d:getcontentlength>6</d:getcontentlength>
        <d:version-name>V1</d:version-name>
        <d:creator-displayname />
        <d:comment />
      </d:prop>
    </d:propstat>
  </d:response>
</d:multistatus>

重要!WebDAV 向导为 Visual Studio 生成的代码会生成带有参数的版本 URL。Microsoft Office 在打开文档时截断参数。这就是为什么如果要将版本保存回服务器,则必须更改服务器实现以生成不带参数的版本 urs。例如,版本 URL 必须如下所示:

http://server/path/file.ext/<v1>

生成版本 URL 的代码位于版本.cs 文件中:

    public static string CreateVersionPath(string itemPath, int versionNumber)
    {
        return itemPath + "?version=" + versionNumber;
    }

解析版本网址并将版本对象返回到引擎的代码位于 DavContext.cs 文件中:

    public override IHierarchyItem GetHierarchyItem(string path)
    {
        path = path.Trim(new[] { ' ', '/' });
        if (path.Contains("?version="))
        {
            return readVersion(path);
        }
        …
    }

最新更新