我在sharepoint中有一个存储word文档的文档库。
如果我点击文档的链接,我会看到一个对话框,其中包含“您想要在readonly或editmode等中打开此文件”,并且可以在编辑模式下打开它,更改它,直接将其保存在单词和更改中保存在文档库中。
文档库中文件的链接如下所示:
<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部件中创建此链接,其中我有文件和文档库的名称?不仅仅复制上面的代码,这不是一个好主意......
是否有一些“官方”方法来实现这一目标?
答案 0 :(得分:10)
不幸的是,似乎没有更好的选择。但至少你可以弄清楚函数定义是什么。 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)
这是我对他们的意思的猜测。请随时添加评论以纠正任何错误或遗漏:
在使用字符串和整数来表示布尔值方面,显然存在一些不一致。你的代码有17个参数也很奇怪,但是我只能找到一个带有15个参数的函数定义,所以我不确定最后两个空字符串是什么用的。其中一些是JavaScript的本质,但它在微软方面看起来也很草率。
这并没有真正回答这个问题,希望它可以帮助你或其他人。
答案 1 :(得分:1)
我最终添加了此代码
return DispEx(this,event,'TRUE','FALSE','FALSE',
'SharePoint.OpenDocuments.3','1', 'SharePoint.OpenDocuments','','','',
'1','0','0','0x7fffffffffffffff','','')
到我的链接标记,因为我无法找到更好的解决方案。
如果有,请告诉我。
答案 2 :(得分:1)
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"]
});
}
答案 3 :(得分: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
到您的文档的网址。
答案 4 :(得分:0)
DispEx在Chrome中不起作用,除非该链接位于包含名为app的属性中的文档类型的div中:
<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');
}
});