Lotus开发之Lotus Notes中域的验证
一:介绍
Lotus中的域主要有以下的类型:文本,日期/时间,对话框列表,复选框,单选按钮,RTF等等。Lotus中域的验证方式有很多种公式,lotusscript,javascript等。如果你使用notes开发c/s的程序,使用公式,ls会很方便,但是如果你是一个b/S的程序员,你会发现notes所有的公式和ls都是运行在服务器端的,此时你在使用公式,ls不但会占用server的资源,而且给用户的体验也是不好的,所以我们推荐使用js来做验证.
二:Domino对域的解析
对于LotusScript,除了Rich-Text域外的元素,如文本、单选框、列表框、复选框等,你可以用几乎相同的代码取得它们的值。例如:如果有一个“Location”域,不论它是何种类型,你都可以用下面的LotusScript代码取得它的值:
fieldVals = doc.Location
或者这样:
fieldVals = doc.GetItemValue("Location")
在LotusScript中,域的类型对于你要取值(值数组)的代码并不重要。但是在JavaScript中,不同类型的域除了显示选项(比如单选框、复选框或者文本)外,并不像在Notes里那样,它们是不同的类型的对象,每一个都要用不同的方式去引用。其实,那也不是绝对的,有些对象是相似的,但是引用过程并不像在LotusScript里那么流畅。
在JavaScript中,没有所谓的Rich-Text域,在HTML中更没有。Notes里提供了一个可以放在浏览器里的富文本Java(不是JavaScript)小程序,从而可以得到富文本的一些功能,但是你并不能用JavaScript来对它编程,而且它也不是一个真正的HTML对象类型。
更让Notes开发人员惊讶的是,在Web上还没有数字型或时间型的域。HTML的域都是文本型的。尽管你能用它们来收集数字信息,如数量或单价,而保存的数据依然是文本。为了像数字一样使用它,你必须把它转换成数字类型。另一个区别是在Web上没有计算域,但并不意味着你不能在你的表单里加入计算域。你可以加入计算域,计算值将会在Web页中显示,除非域是隐藏的。关键是即使域就在那里显示,而HTML通常的处理是没有定义域。如果你把test域改成计算域而不是可编辑的,在测试时你会发现其值是取不到的,我们可以对比下计算域和可编辑域生成的html代码:
计算域的时候生成的代码(js是取不到值的):
<form method="post"
action="/weboa/ggxx/Dinner.nsf/test?OpenForm&Seq=1" name="_test">
<input type="hidden" name="__Click" value="0">dddddddd
<br>
<input type="button" onclick="alert(document.forms[0].test.value);
" value="test">
</form>
非计算域时候客户端生成的代码:
<form method="post"
action="/weboa/ggxx/Dinner.nsf/test?OpenForm&Seq=1" name="_test">
<input type="hidden" name="__Click" value="0">
<input name="test" value="dddddddd">
<br>
<input type="button" onclick="alert(document.forms[0].test.value);
" value="test"></form>
多值域
HTML的域没有Notes的域那样的多值属性。可以试一下:在表单上加入第二个按钮和第二个域。把域命名为“Letters”,类型为可编辑文本,选中“允许多值(Allow multiple values)”复选框。将默认值写成如下的字母列表:
"A":"B":"C":"D":"E":"F":"G"
把按钮命名为“Get multiple values”并键入如下的JavaScript代码:
alert(document.forms[0].Letters.value);
你可以用不同的分隔符来改变此域的值,但是当你单击按钮时,你会注意到,不论你用什么分隔符,提示你的总是域的所有值。这和在Notes客户端中运行的@Formulas和LotusScript形成了对比。用@Prompt,你得到的提示只是域的第一个值:“A”。你用LotusScript同样也只能显示一个值,但是你要指定数组下标,否则将得到一个错误提示。公式和LotusScript都不能在提示语句中得到多值域的所有值。
原因就是,在Notes的语言中,确实有多个值在域中。对于HTML和JavaScript来说,只有一个值。再次看Web页面的源代码你会发现和下面类似的代码:
<input name="Letters" value="A;B;C;D;E;F;G">
注意它的值是用“一对”双引号引起来的带分隔符的值。
单选按钮
另一个有趣的地方是单选按钮,就Notes和Web页面而言,Notes里的单选按钮是一个有多个值的单个域,在Web上是同名的输入文本框的数组。为了理解以上所述,请看下面的例子:
在表单上,加入另一个新域,名字为“RadioButtn”。正像它的名字一样,把它改成单选框类型的域。在域属性窗口的第二个标签中,输入下列选项和别名
One | A
Two | B
Three | C
Four | D
把此域的缺省值设成第一个选项的别名,也就是带引号的字母“A”。现在在浏览器里预览表单,再看源文件,你会看到单选按钮的代码和正常域的代码有很大区别。HTML代码看起来将和下面的类似:
<input type="radio" name="RadioButtn" value="A" checked>One<br>
<input type="radio" name="RadioButtn" value="B">Two<br>
<input type="radio" name="RadioButtn" value="C">Three<br>
<input type="radio" name="RadioButtn" value="D">Four
在这里你要注意一些要点。首先,所有的4个单选按钮对象有同一个名字:RadioButtn,这样一来,HTML和JavaScript就知道它们是同一个数组里的对象。其次,每个选项的值是选项的别名,并不是看到的文字(例如“One”、“Two”等)。这和在Notes中保存的是别名是一样的,保存的不是看到的文本(当然如果没有别名的话,保存的值和文本就是一样的了)。 最后,你选中第一个选项的方法是在HTML语句中用的“checked”单词,它被加在了第一个单选按钮的语句里。
如果你再加入另外的一个按钮,用和取其他两个域值同样的方法来取RadioButtn的值的话,你会得到一个奇怪的错误,也就是用下面的代码:
alert(document.forms[0].RadioButtn.value);
你将会看到一个提示“undefined”的错误对话框
这里的问题并不是没有定义它的值。毕竟如上面所示,单选按钮的代码中共有4个值。也就是说,问题出在RadioButtn本身,至少是现在用在这里的那个。单选按钮是一个输入选项的数组,如果你想要知道其中一个元素的值,必须指定是哪一个,试试下面的代码:
alert(document.forms[0].RadioButtn[0].value);
好,返回的是当前域的值“A”,但是当你选择其他的选项时再单击按钮,你得到的依然是“A”,而不是你所选择的值,还是不太妙。
为了得到选择的选项的值,首先要知道哪个选项被选中了,然后在alert语句中,用那个选中的选项的下标值来正确地引用当前选项的值。也就是说,如果第一个选项被选中,你应该取RadioButtn[0].value,如果第二个选项被选中,你就应该取RadioButtn[1].value,依此类推。
在JavaScript中,某些类型的域具有selectedIndex属性,代表当前选中选项的数组下标值。然而单选按钮并不是那么幸运,同样,复选框也没能逃脱厄运。要想得到当前选中的单选按钮的值,你必须在RadioButtn数组元素中查找“checked”属性。和LotusScript相比,LotusScript就能像操作其他类型的域一样来取得单选按钮当前被选中的值。这是一件非常麻烦的事,但是,它就是那样的。
下面是按钮的代码:
var doc = document.forms[0];
for(i = 0; i <
doc.RadioButtn.length; i++){
if(doc.RadioButtn[i].checked){
alert(doc.RadioButtn[i].value);
break;
}
}
复选框
复选框和单选按钮类似。在此就不多做说明.
三:编写通用函数来验证
上面就是notes基本的域,也是使用频率最高的域值,我们可以写一个通用的函数来验证这些域值,下面以验证域的非空为例
function checkField(fieldType,fieldName,tip)
{
switch (fieldType){
case "radio":
var radionum=0;
var a = document.getElementsByName(fieldName);
for (var i=0; i<a.length; i++)
{
if ((a[i].type == "radio")&&(a[i].checked))
{
radionum++;
}
}
if (radionum==0)
{
alert(tip+'不能为空');
return false;
}
return true;
case "checkbox":
var checkboxNum=0;
var a = document.getElementsByName(fieldName);
for (var i=0; i<a.length; i++)
{
if ((a[i].type == "checkbox") && (a[i].checked)==true)
{
checkboxNum++;
}
}
if (checkboxNum==0)
{
alert(tip+'不能为空');
return false;
}
return true;
case "select":
var objcheck = document.getElementById(fieldName);
var selectedValue = objcheck[objcheck.selectedIndex].text;
if(selectedValue=="")
{
alert(tip+'不能为空');
return false;
}
return true;
case "text":
var objtext = document.getElementById(fieldName);
if(objtext.value=="")
{
alert(tip+'不能为空');
return false;
}
return true;
default:
return false;
} //end switch
}
RTF文本
Lotus的域中是一个比较特殊的域,他可以包含附件,对象等等,自然他的验证也就比较特殊,RTF域用js也是可以取到的,可以对其进行空的校验,但是用js却不能校验其里面有没有附件,嵌入式对象,一般我用就使用ls来校验
验证的富文本中,只包含一个附件、嵌入式对象或者链接的输入是允许的,即使它不包含相应的文本。同样,还是使用包含域的表单的 Querysave 事件:
Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim rtitem As NotesRichTextItem
Set doc = Source.Document
Set rtitem = doc.GetFirstItem( "rtfield" )
Dim text As String
text$ = Source.FieldGetText("rtfield")
trimmed$ = Trim(text)
If(doc.Hasembedded) Then
Continue = True
Elseif ( trimmed$ = "") Then
Msgbox "Please enter some text."
Continue = False
source.GotoField("rtfield")
source.Refresh(True)
Else
Continue = True
End If
End Sub
如果文档的任何地方有一个附件,即使它不在所验证的域中,该代码也会工作.
就说到这吧~~~
Lotus开发之Lotus Notes中域的验证的更多相关文章
- 如何在Spring框架上做开发之Context启动中的“Hook”
1.概述 有些时候,我们需要在spring启动过程中加入一些自己的逻辑,特别是一些基本框架和spring做整合的时候(例如:mybatis-spring-boot-starter),就需要使用Spri ...
- android开发之在activity中控制另一个activity的UI更新
转自:http://blog.csdn.net/jason0539/article/details/18075293 第一种方法: 遇到一个问题,需要在一个activity中控制另一个acitivit ...
- 游戏开发之在UE4中编写C++代码控制角色
当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...
- 3D游戏开发之在UE4中创建非玩家角色(NPC)
接着上节我们继续学习,现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 一 创建C++类 1) 在UE编 ...
- Liferay7 BPM门户开发之16: Liferay中用户\站点\组织架构\角色\用户组以及关联关系
用户 . 站点 . 组织架构 . 角色 . 用户组分别是:Users. Site. Organization. Role. UserGroups Users 用户是Liferay portal中的关键 ...
- Liferay7 BPM门户开发之7: Activiti中的重要概念和主要数据库结构
流程的人员参与角色: Assignee :签收者(即待办人) Candidate:候选人 Owner:拥有者 Starter:启动者 participant:参与者,包含查阅 流程变量的类型: Str ...
- Unity3D游戏开发之C#编程中常见数据结构的比较
一.前言 Unity3D是如今最火爆的游戏开发引擎,它可以让我们能轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型的互动内容.它支持2D/3D游戏开发,据不完全统计,目前国内80%的手机游戏都 ...
- Unity3D游戏开发之在Unity3D中视频播放功能的实现
版权声明:欢迎订阅公众号[5厘米的理想],愿生命里的每个小理想,都能成为生命里的小确幸.本文地址为: https://blog.csdn.net/qinyuanpei/article/details/ ...
- android开发之java代码中字符串对比忽略大小写。java程序员必回,可用来比对验证码等问题
比如:字符串a与字符串B对比,只需调用 a.equalsIgnoreCase(B);即可.很简单的一个方法.忽略大小写.
随机推荐
- 专题:『Channel Bonding/team』——EXPERIMANTAL!!!
Linux内核支持的多网卡聚合方法——bond.team bond 优点:经过长时间的实践检验,具有较高的稳定性:kernel-2.4及以上内核均广泛支持 缺点:需要通过sysfs或发行版定制的网卡配 ...
- Servlet深层知识
一.ServletContext实现请求转发1.得到请求分发器:RequestDispatcherServletContext.getRequestDispatcher(String path):pa ...
- Ubuntu下修改hosts文件
Ubuntu系统的Hosts只需修改/etc/hosts文件,修改完之后要重启网络.具体过程如下:1.修改hostssudo gedit /etc/hosts2.添加解析记录( . )或者从githu ...
- Android相机使用(系统相机、自定义相机、大图片处理)
本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人Surf ...
- Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理)
也许这一篇文章的内容有点枯燥,但我要说的是如果你想深入的了解游戏引擎是如何处理动画片断或者素材并 让玩家操控的角色动起来栩栩如生,那么这真是一篇好文章(当然我仅仅是翻译了一下) 动画脚本 Anim ...
- inotify 心得
inotify 心得 一.inotify简介 inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件 ...
- ios图片的压缩
最近做图片的上传,由于项目中的涉及到的图片是从相册和相机中拍照获取的,所以图片的类型不一定,有些是jpg有些是png,另外随着现在设备相继的像素越来越高,所拍摄的图片也越来越到,在图片上传之前我们是需 ...
- java中Class.getResource用法
用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file ...
- 利用Formdata实现form提交文件上传不跳转页面
作者:幻月九十链接:https://www.zhihu.com/question/19631256/answer/119911045来源:知乎著作权归作者所有,转载请联系作者获得授权. $('form ...
- Dynamic CRM 2013学习笔记(四十三)流程6 - 自定义流程活动
当我们在流程里添加步骤时,有一些默认的步骤,像创建.更新.发邮件等,但如果你想加一个里面没有的步骤,比如发SMS消息,或者调用一个外部的web service,怎么办?这时就只能自定义一个流程活动了. ...