天天看點

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> 

非計算域時候用戶端生成的代碼:

action="/weboa/ggxx/Dinner.nsf/test?OpenForm&Seq=1" name="_test">

<input type="hidden" name="__Click" value="0">

<input name="test" value="dddddddd">

" 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;  

            if  ((a[i].type  ==  "checkbox") && (a[i].checked)==true) 

    checkboxNum++;

        if  (checkboxNum==0)  

    return true;

   case "select":

     var objcheck = document.getElementById(fieldName);

     var selectedValue = objcheck[objcheck.selectedIndex].text;

     if(selectedValue=="")

     {

   alert(tip+'不能為空');  

           return  false;  

  }

   case "text":

     var objtext = document.getElementById(fieldName);

     if(objtext.value=="")

   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

如果文檔的任何地方有一個附件,即使它不在所驗證的域中,該代碼也會工作.

就說到這吧~~~

本文轉自生魚片部落格園部落格,原文連結:http://www.cnblogs.com/carysun/archive/2008/03/10/1098444.html,如需轉載請自行聯系原作者

繼續閱讀