6

我在 sharepoint 中有一个文档库,用于存储 word 文档。

如果我点击文档的链接,我会看到一个对话框,上面写着“你想以只读或编辑模式等方式打开这个文件”,并且可以在编辑模式下打开它,更改它,直接保存在 word 中,更改保存在文档库。

文档库中文件的链接如下所示:

<a onfocus="OnLink(this)" 
   href="/test/DocLib2/wordtest.docx" 
   onmousedown="return VerifyHref(this,event,'1','SharePoint.OpenDocuments','')"     
   onclick="return DispEx(this,event,'TRUE','FALSE','FALSE',
            'SharePoint.OpenDocuments.3','1', 'SharePoint.OpenDocuments',
            '','','','1','0','0','0x7fffffffffffffff','','')"
>wordtest</a>

如何在我拥有文件和文档库名称的自己的 Web 部件中创建此链接?如果不只是复制上面的代码,那不是一个好主意......

是否有一些“官方”方法来实现这一目标?

4

5 回答 5

12

不幸的是,似乎没有更好的选择。但至少你可以弄清楚函数定义是什么。DispEx 函数在 core.js 文件中定义(但在 core.debug.js 中更容易阅读)。两者都在 14\Templates\Layouts\1033 目录中。

这是函数定义:

function DispEx(ele, objEvent, fTransformServiceOn, fShouldTransformExtension,
    fTransformHandleUrl, strHtmlTrProgId, iDefaultItemOpen, strProgId, strHtmlType, 
    strServerFileRedirect, strCheckoutUser, strCurrentUser, strRequireCheckout, 
    strCheckedoutTolocal, strPermmask)

这是我对它们含义的猜测。请随时添加评论以纠正任何错误或遗漏:

  • ele - [obj] 元素
  • objEvent - [obj] 事件对象
  • fTransformServiceOn - [bool](未知功能)默认为 True
  • fShouldTransformExtension - [bool](未知功能)默认为 False
  • fTransformHandleUrl - [bool](未知功能)默认为 False
  • strHtmlTrProgId - [字符串] ActiveXControl 的名称,尝试将默认值加载到 SharePoint.OpenDocuments.3
  • iDefaultItemOpen - [int] 默认编辑或读取指示符默认为 1
  • strProgId - ActiveX 控件的 [字符串] 名称
  • strHtmlType [string](未知功能)默认为空
  • strServerFileRedirect - [字符串](未知功能)
  • strCheckoutUser [string] 签出文档的用户 ID
  • strCurrentUser - [string] 当前用户的 ID
  • strRequireCheckout - [字符串] 指示是否强制结帐
  • strCheckedoutTolocal - [字符串] 指示是否使用本地草稿文件夹
  • strPermmask - 当前用户的 [string] 权限掩码默认为 0x7fffffffffffffff

在使用字符串和整数表示布尔值方面显然存在一些不一致之处。你的代码有 17 个参数也很奇怪,但我只能找到一个有 15 个参数的函数定义,所以我不确定最后两个空字符串是做什么用的。其中一些是 JavaScript 的本质,但它在 Microsoft 方面看起来也很草率。

这并不能真正回答问题,希望它可以帮助您或其他人。

于 2013-01-09T20:16:01.200 回答
2

Chad Schroeder 发表了一篇关于如何在 C# 中构造 javascript 函数调用的博客文章。考虑到一些设置,例如强制结帐和在浏览器或客户端中打开。

private string GetFileViewScript(SPFile file)
    {
        string text = SPUtility.MapToControl(SPContext.Current.Web, file.Name, string.Empty);
        string text2 = (file.Item.ParentList.DefaultItemOpen == DefaultItemOpen.Browser) ? "1" : "0";
        SPFieldLookupValue sPFieldLookupValue = file.Item["CheckedOutUserId"] as SPFieldLookupValue;
        string scriptLiteralToEncode = (sPFieldLookupValue == null) ? string.Empty : sPFieldLookupValue.LookupValue;
        string text3 = (SPContext.Current.Web.CurrentUser != null) ? SPContext.Current.Web.CurrentUser.ID.ToString(CultureInfo.InvariantCulture) : string.Empty;
        string text4 = file.Item.ParentList.ForceCheckout ? "1" : "0";

        return string.Format(CultureInfo.InvariantCulture, "return DispEx(this,event,'{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}')", new object[]
        {
            "TRUE",
            "FALSE",
            "FALSE",
            text,
            text2,
            text,
            string.Empty,
            string.Empty,
            SPHttpUtility.EcmaScriptStringLiteralEncode(scriptLiteralToEncode),
            text3,
            text4,
            (string)file.Item["IsCheckedoutToLocal"],
            (string)file.Item["PermMask"]
        });
    }

在指向 SharePoint 文档的链接中使用 DispEx

于 2014-09-23T07:59:21.653 回答
1

我最终添加了这段代码

return DispEx(this,event,'TRUE','FALSE','FALSE', 
'SharePoint.OpenDocuments.3','1', 'SharePoint.OpenDocuments','','','',
'1','0','0','0x7fffffffffffffff','','')

到我的链接标签,因为我找不到更好的解决方案。

如果有,请告诉我。

于 2012-09-03T12:43:44.987 回答
1

DispEx 在 Chrome 中不起作用,除非链接位于一个 div 中,该 div 包含名为 app 的属性中的文档类型:

<div class="ms-vb  itx" ctxname="ctx19" id="2" app="ms-word">
    <a onfocus="OnLink(this)" 
       href="/test/DocLib2/wordtest.docx" 
       onmousedown="return VerifyHref(this,event,'1','SharePoint.OpenDocuments','')"     
       onclick="return DispEx(this,event,'TRUE','FALSE','FALSE',
            'SharePoint.OpenDocuments.3','1', 'SharePoint.OpenDocuments',
            '','','','1','0','0','0x7fffffffffffffff','','')">wordtest</a>
    <span class="ms-newdocument-iconouter">
        <img class="ms-newdocument-icon" src="/_layouts/15/images/spcommon.png?rev=23" alt="new" title="new">
    </span>        
</div>

您需要将其包装在这样的 div 中,并确保插入将打开文件的正确应用程序,或者通过查看文件扩展名来制作自己的列表:

$('.test_links').click(function(e) {
    e.preventDefault();
    if (!!window.chrome) {
        var extenstion = this.href.substr(this.href.lastIndexOf('.') + 1);
        var prefix = '';
        switch (extenstion) {
            case 'doc':
            case 'docx':
                prefix = 'ms-word:ofv|u|';
                break;
            case 'xls':
            case 'xlsx':
                prefix = 'ms-excel:ofv|u|';
                break;
        }
        window.location.href = prefix + this.href;
    } else {
        DispEx(this, e, 'TRUE', 'FALSE', 'FALSE', 'SharePoint.OpenDocuments.3', '0', 'SharePoint.OpenDocuments', '', '', '', _spPageContextInfo.userId + '', '0', '0', '0x7fffffffffffffff');
    }
});
于 2017-02-21T07:41:30.140 回答
0

我不记得是否有官方的能力可以用 JavaScript COM 做到这一点,但你可以使用 ASP.NET HyperLink 控件来生成类似的链接。例如放入布局

<asp:HyperLink ID="EditHl" runat="server" Text="Edit document"/>

在代码隐藏中

EditHl.Attributes["attribute name"] = "attribute value";

只需使用来自 OOTB 链接的相同值,但要更改

/test/DocLib2/wordtest.docx

到您的文档的 URL。

于 2012-08-16T11:40:02.507 回答