Xpages 即使数据库在服务器上,扩展库名称选择器也会获取local Names.nsf

Xpages 即使数据库在服务器上,扩展库名称选择器也会获取local Names.nsf,xpages,xpages-extlib,Xpages,Xpages Extlib,我在一个XPage上有一个名字选择器,它的数据提供者是DominanabNamePicker,addressBookSel=all public,people and groups=true。使用Notes客户端的Domino服务器上的数据库显示my local Names.nsf。如果我在浏览器中打开数据库,它会从服务器中选择正确的names.nsf。 无法确定这是否是我的客户端、服务器或XPages中设置的结果。在两台不同的PC上执行相同的操作。 我认为“全民”会强迫它只开放公共NAB,但事

我在一个XPage上有一个名字选择器,它的数据提供者是DominanabNamePicker,addressBookSel=all public,people and groups=true。使用Notes客户端的Domino服务器上的数据库显示my local Names.nsf。如果我在浏览器中打开数据库,它会从服务器中选择正确的names.nsf。 无法确定这是否是我的客户端、服务器或XPages中设置的结果。在两台不同的PC上执行相同的操作。
我认为“全民”会强迫它只开放公共NAB,但事实并非如此。

我自己也问了同样的问题

答案,在控件中添加 addressBookDb=“服务器!!名称.nsf”

从这里开始


在经历了一段相当多的挫折之后,我让它为Notes客户端和Web客户端工作。也许这对你们大多数人来说是显而易见的,但对我来说肯定不是。 首先在名称选择器上,我创建了一个名称选择器聚合器。然后,我添加了一个多米诺纳姆选择器 在addressBookDb中,我放置了以下SSJ:

var server:String = @Name("[CN]",session.getCurrentDatabase().getServer());
var allNABs:Array = session.getAddressBooks().iterator();
var pubNABs = new Array;
var privNABs = new Array;
while (allNABs.hasNext()) {
    var db:NotesDatabase = allNABs.next();
    if (db.isPublicAddressBook()){
        pubNABs.push(db.getFileName())
    } else {
        privNABs.push(db.getFileName())
    }
    db.recycle()
}


   if (pubNABs[0] == ""){
    return privNames[0];
    break;
} else {
    return server + "!!" + pubNABs[0];
    break
}
然后,我添加了第二个DominanabNamePicker,除了返回为

if (pubNABs[1] != "") {
    return server + "!!" + pubNABs[1];
    break;
} else {
    return "";
}

这段代码适用于Notes客户端和Web客户端,因此我现在是一个快乐的露营者,除非我在某个地方找到了gotcha。

以下是我最终的做法。我对地址簿的最大数量设置了一个限制(不是很大,但它可以工作),即您可以创建任意数量的地址簿。因此,我创建了两个sessionScope变量,这是我在XPage上的after Page Loads事件中创建的。我用了这个公式

var allNABs:Array = session.getAddressBooks().iterator();
var pubNABs = new Array;
var privNABs = new Array;
while (allNABs.hasNext()) {
    var db:NotesDatabase = allNABs.next();
    if (db.isPublicAddressBook()){
        pubNABs.push(db.getFilePath())
    } else {
        privNABs.push(db.getFilePath())
    }
    db.recycle()
}
sessionScope.put("ssPublicNABs", pubNABs);
sessionScope.put("ssPrivateNABs", privNABs);
因为我在同一个页面上使用了几个不同的姓名选择器,所以我不想重复必须在地址簿中循环的内容。 然后我创建了4个NamePicker控件,并向每个后续控件添加了1、2、3和4个NamePicker提供程序。然后根据公共广播簿的数量设置渲染属性,这样它们就不会向我爆炸。每个提供程序上的db name属性为:

var server:String = @Name("[CN]",session.getCurrentDatabase().getServer());
var pubNABs:Array = sessionScope.get("ssPublicNABs");
    return server + "!!" + pubNABs[0];
其中pubNABs[n]返回NAB的正确文件路径。它在Notes客户端和Web上都能很好地工作。
然后,为了使它不会在本地断开连接的副本上爆炸,我又创建了4个控件,并做了同样的事情,但使用了具有适当渲染属性的privNABs,因此没有冲突。似乎还有很长的路要走,我相信有一种更简单的方法,但它是有效的。

我想可能是重复的,但硬编码服务器名称不是一个好的选择,而且服务器上可能有多个公共NAB。我尝试了dominoViewNamePicker,它工作正常,适用于Notes客户端,但仍然不能解决多个NAB的问题。尝试将此作为一般情况编写,从会话中获取服务器名称,然后获取所有NAB并循环它们,获取公共名称。addressBookDb不接受数组。另外,不要想服务器名!!names.nsf在web浏览器中工作。通用名称选择器在浏览器中运行良好。很快会有一点问题。当我试图编写一个通用案例时,我创建了第三个DominanabNamePicker,它解析为“”,因为服务器上只有两个公共NAB,当我尝试打开文档时,代码会返回一个错误。有没有办法禁用DominanabNamePicker?根据session.getAddressBooks返回的地址簿数量,使用不同数量的DominanabNamePicker提供程序创建多个NamePicker控件,然后对它们进行迭代并生成公共和私有NAB列表,就可以做到这一点。需要为public和private分别设置一组名称选择器,然后适当地设置呈现的属性。可能是一种更好的方法,但这种方法还可以