亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP+JS處理復雜表單的生成與驗證

2019-11-18 16:44:54
字體:
來源:轉載
供稿:網友

  這里所謂的復雜表單,是指表單中包含多種不同的輸入類型,比如下拉列表框、單行文本、多行文本、數值等。在經常需要更換這類表單的場合,需要有一個表單的動態生成程序。本文介紹的正是這樣一個系統,它以數據庫保存表單定義數據,利用asp腳本動態生成表單HTML代碼以及驗證表單輸入的腳本。

  一、定義數據庫表結構

  在Web上經??梢钥吹健懊恐苷{查”之類的表單,這就是一種需要經常更新的表單。如果有一個動態生成表單及其驗證腳本的程序,可以大大減少制作這些表單的工作量。

  在本文的動態表單生成與驗證示例中,我們使用一個access數據庫來存儲有關表單的定義信息,同時為簡單計,用戶在表單中輸入的數據也保存到同一數據庫。定義表單需要兩個表:第一個表(Definitons)用于表單輸入域的定義,第二個表(Lists)保存各個輸入域的附加信息,比如選擇列表的選擇項。

  表Definitons包含如下字段:

FieldName —— 賦予表單輸入域的變量名字
Label —— 即文本標簽,顯示在輸入域前面的提示性文字
Type —— 單個字符,該字符表示表單輸入域的形式和輸入值的類型
  具體如下:

  (t) 文本輸入框,即< INPUT TYPE="TEXT" >。

  (n) 文本輸入框,但要求輸入數字值。

  (m) 備注型內容,用于注釋或其他大量文本的輸入,它是一個多行文本編輯框。

  (b) 要求輸入“是”或“否”。本實現中將用復選框來獲取這種輸入,復選框的文本標簽為“是”。如果用戶選中它,則返回值是“on”。

  (r) 單選按鈕。

  (l) 下拉列表框。

  Min —— 僅對數字型輸入值有效,在這里給出最小值。在本例中有一個“Age”(年齡)數字型輸入框,它的最小值設定為1。

  Max —— 該字段的值與輸入域形式有關。對于數字型輸入框,它表示的是允許的最大值。例如“Age”的Max值為100。對于文本輸入框,Max表示允許的最多字符個數。對于多行文本編輯框,Max表示可見區域的文本行數。

  Required —— 表示是否必須輸入。這種類型的值如果沒有輸入,則輸入驗證程序將報告錯誤。在表單中,必須輸入的值以星號標記,并以腳注的形式提示用戶該類值必須輸入。

  本文的示例表單是一個ASP程序員調查表,在Definitons表中該表單的定義主要如下:

  FieldName Label Type Min Max Required

  Name 姓名 文本(t) - 50 否

  Age 年齡 數字(n) 1 100 否

  Sex 性別 單選按鈕(r) - - 是

  E-mail 郵件地址 文本(t) - - 是

  Language 編程語言 下拉列表框(l) - - 否

  表Lists用于保存輸入域定義的一些附加信息,本例有“Sex”和“Languages”兩個輸入值要用到它。表Lists非常簡單,只包含如下三個字段:

  FieldName —— 當前記錄屬于哪個表單輸入域

  Value —— 選擇項的值

  Label —— 用戶所看到的選擇項的提示文本

  輸入域“Sex”只能從兩個值選?。骸澳小被颉芭薄!癓anguage”列出了幾種可應用于ASP環境的編程語言,包括:VBScript,javaScript,C,Perl和“其他”。

  第三個表“Records”保存用戶提交的內容,它也包含三個字段,每個記錄對應用戶的一次提交:

  Record —— 備注類型,以查詢字符串形式保存的用戶輸入。

  Created —— 用戶提交該表單的日期和時間。 RemoteIP —— 表單提交者的IP地址。

  在實際應用中可能要收集更多有關用戶的信息,為簡單計,本例只記錄提交時間和用戶IP地址這兩個附加信息。

  二、準備工作

  在完成上述數據結構和表單的定義之后,接下來就可以編寫腳本。腳本的任務是生成表單以及處理用戶提交的表單。

  無論是表單的生成還是處理,以下三個過程(任務)都是必不可少的:第一是確定驗證類型,在生成表單時驗證類型值通過查詢字符串獲得,在處理表單時從表單隱藏域讀取。程序支持的表單驗證方式共有以下四種類型:不進行驗證,客戶端Javascript驗證,服務器端ASP腳本驗證,客戶端和服務器端都進行驗證(代號分別為0到3)。如果沒有在查詢字符串中指定合法的驗證方式,則默認第四種驗證方式。這種驗證處理方式使得我們可以靈活地應用這個表單生成、處理系統,當客戶端禁止使用JavaScript驗證時就可以僅在服務器端執行驗證過程。下面是確定驗證類型的代碼:

  檢查驗證類型

以下是引用片段:
  iValType = Request.QueryString("val")
  If IsNumeric(iValType) = False Then iValType = 3
  If iValType > 3 Or iValType < 0 Then iValType =3


  第二個任務是打開數據庫連接,創建兩個記錄集對象:RS對象,這是本程序中的主要記錄集對象,用來操作Definitions表;RSList對象,主要用于從Lists表讀取數據。示例程序提供兩種數據庫連接方法:使用ODBC DSN或不使用ODBC DSN(使用DSN時需要先創建名為Dynamic的DSN,使用DSN連接數據庫的代碼已經被注釋掉)。

  第三個任務是在生成(或處理)表單腳本的前面(和后面)輸出一些靜態的HTML代碼,比如< HEAD >< /HEAD >,以及在腳本運行結束的時候釋放RS、RSList等對象占用的資源。

  除了完成上述任務的代碼外,示例應用中其余ASP腳本可能生成的頁面有兩種類型:提問表單(見上圖)以及表單提交后出現的結果頁面(后者同時還負責用戶提交結果的記錄)。要確定究竟運行哪一部分腳本,最簡單的方法就是檢查是否已經提交表單:如是,則處理表單;否則生成表單。

  是生成表單還是處理表單?

以下是引用片段:
  If Len(Request.Form) = 0 Then
  '生成表單
  ...略...
  Else
  '處理表單
  ...略...
  End If

  三、動態生成表單

  生成表單時,程序按照Definitons表中的各個輸入域定義記錄,依次生成相應的表單HTML代碼和JavaScript代碼。HTML代碼中首先要生成的是文本標簽:

以下是引用片段:
  sHTML = sHTML & vbTab & "< TR >" & vbCrLf & vbTab & vbTab
  sHTML = sHTML & "< TD VALIGN=" & Chr(34) & "TOP" & Chr(34)
  sHTML = sHTML & " >" & vbCrLf & vbTab & vbTab & vbTab
  sHTML = sHTML & "< B >" & RS.Fields("Label")


  然后程序檢查當前輸入域是否必須輸入。如果必須,則在標簽文本之后加一個星號(表示該值必須輸入),同時對于必須輸入的值,還要生成相應的JavaScript代碼來驗證它。對于單選按鈕或選擇列表,需進一步檢查用戶確實選擇了某個選項;對于所有其他輸入類型,只要檢查輸入值不為空即可。

  緊接文本標簽的是表單的輸入元素,這些元素的HTML代碼根據Definitions表中指定的類型和屬性生成。再接下來就是根據輸入值要求生成執行客戶端驗證任務的JavaScript代碼。對于本例,只有數字型的值需要進一步檢查以保證用戶的輸入確實是數字,而且數字值在許可的最大值和最小值之間。生成上述代碼之后,就可以結束一個表格行(也就是一個輸入域)繼續處理Definitions表的下一個記錄。一旦所有的數據庫記錄處理完畢,下一步就可以加入“提交”按鈕和“清除”按鈕的HTML代碼。如果換個角度來看,程序在這里的任務就是根據數據庫記錄生成各個輸入域,每個輸入域占用一個表格行,每個表格行二個單元:第一個單元用來顯示文本標簽,第二個單元顯示輸入元素本身(代碼見dForm.asp)。

  上述過程結束之后,表單的HTML代碼和驗證用JavaScript函數分別保存到了變量sHTML和sJavaScript中。在把這些內容寫入頁面之前,程序檢查客戶端是否要求執行JavaScript驗證,如果不要求執行這類驗證,則清除sJavaScript變量:

  If iValType = 0 Or iValType = 2 Then sJavaScript = ""

  在輸出BODY標記之后,程序輸出如下JavaScript函數:

以下是引用片段:
  < SCRIPT LANGUAGE="JavaScript" > 
  < !-- 
  function validate(TheForm){ 
  //客戶端表單驗證 
  < %=sJavaScript% > 
  return true; 
  } 
   
  function CheckRadio(objRadio){ 
  //單選按鈕中是否有某個值被選中 
  for(var n = 0; n < objRadio.length; n++){ 
  if(objRadio[n].checked){ 
  return true; 
  } 
  } 
  return false; 
  } 
   
  function CheckList(objList){ 
  //是否已經在選擇列表中選擇了某個值 
  for(var n = 1; n < objList.length; n++){ 
  if(objList.options[n].selected){ 
  return true; 
  } 
  } 
  return false; 
  } 
  //-- > 
  < /Script >


  如果客戶端不需要JavaScript驗證,則validate函數只剩下一個“return true”語句。上面代碼中的后面兩個靜態JavaScript函數(CheckRadio和CheckList)用于驗證單選按鈕和下拉列表框,當這兩種輸入域需要驗證時validate函數將調用它們。

  現在可以開始把表單寫入頁面:

  < FORM ACTION="./dform.asp" METHOD="POST" NAME="MyForm" onSubmit="return validate(this)" >

  在這里,只有當validate函數返回true時才執行表單提交操作。因此當客戶端JavaScript驗證功能關閉時,validate函數將自動返回true。

  接下來要加入的是名為val的隱藏域。如前所述,該值指示表單的驗證模式。

  < INPUT TYPE="HIDDEN" NAME="val" VALUE="< %=iValType% >" >

  當用戶提交表單時,處理腳本將根據該值確定是否執行服務器端驗證。

  然后輸出的是表格標記以及表格標題。標題保存在變量sTitleLabel中,該值在腳本開始執行時初始化:

以下是引用片段:
  < TABLE BORDER="0" > 
  < TR > 
  < TD COLSPAN="2" ALIGN="CENTER" > 
  < H2 >< %=sTitleLable% >< /H2 > 
  < /TD > 
  < /TR >


  作為改進措施,可以在表Definitions、Lists和Records中增加一個字段FormID。FormID唯一標識一個表單,這樣程序就可以同時地定義多個表單、保存多個表單的用戶應答結果。至于上面的sTitleLabel,我們可以用另外一個表(比如Forms)來保存。

  緊接著表格標記和表格標題,程序輸出的是HTML表單以及“提交”、“清除”按鈕的代碼。在此之后,程序檢查sHTML字符串中是否包含“*”,如包含的話說明表單中存在必須輸入的內容,此時就輸出一個腳注以說明該星號的含義。

以下是引用片段:
  < %=sHTML% > 
  < TR > 
  < TD COLSPAN="2" ALIGN="CENTER" > 
  < INPUT TYPE="SUBMIT" VALUE="提交表單" > < INPUT TYPE="reset" VALUE="清除" > 
  < /TD > 
  < % 
  '是否存在必需輸入的表單域,如存在,則輸出表單腳注解釋'*'的含義 
  If InStr(sHTML,"*") Then 
  % > 
  < /TR > 
  < TD COLSPAN="2" ALIGN="CENTER" > 
  < FONT SIZE="2" >注意:有星號標記的值必需輸入。< /FONT > 
  < /TD > 
  < /TR > 
  < % 
  End If 
  % > 
  < /TABLE > 
  < /FORM >


  至此為止,表單的生成任務已經完成。
  四、處理提交結果

  ASP腳本剩下的任務是服務器端的表單處理,包括驗證、將結果保存到數據庫以及“提交成功/失敗”頁面的顯示。在這部分表單驗證代碼中用到了一個字符串變量sBadForm,程序用它來保存錯誤信息。如果在驗證過程結束時sBadForm為空,說明用戶提交的表單是合法的;否則,拒絕該表單的提交并把sBadForm返回給瀏覽器。

  不管表單采用哪種驗證模式,檢查HTTP_REFERER都是一種好的習慣。這種檢查可以防止腳本被盜用。要檢查某個POST是否來自本網站的頁面或腳本,只需比較兩個服務器變量即可:

以下是引用片段:
  If InStr(Request.ServerVariables("HTTP_REFERER"), _
  Request.ServerVariables("HTTP_HOST")) = 0 Then
  sBadForm = "< LI >表單提交自不正確的位置。" & vbCrlf
  End If


  如果表單的隱藏域指示必須進行服務器端驗證,則程序遍歷表單定義數據庫記錄作相應的檢查,其過程與表單的生成非常相似,只不過此時程序是驗證表單,且把輸入值非法信息加入到sBadForm中去而已。具體代碼見dForm.asp。

  程序最后檢查sBadForm是否為空。如不為空,則拒絕表單提交并將sBadForm寫入瀏覽器。如果sBadForm為空,則在Records表增加一個記錄保存表單數據。在保存表單內容之前需要刪除隱藏域val,這個隱藏域總是表單的第一個輸入域:

以下是引用片段:
  If Len(sBadForm) = 0 Then
  RS.Open "Records", DB, 3, 2, &H0002
  RS.AddNew
  RS.Fields("Record") = Mid(Request.Form, InStr(Request.Form, "&") + 1)
  RS.Fields("Created") = Now()
  RS.Fields("RemoteIP") = Request.ServerVariables("REMOTE_ADDR")
  RS.Update
  Response.Write("< H1 >謝謝.< /H1 >")
  RS.Close
  Else
  Response.Write("< H1 >表單提交失敗。< /H1 >")
  Response.Write(vbCrLf & sBadForm)
  End If
  End If


  這就是服務器端表單處理的全部過程。根據是否存在已經提交的表單,我們可以把前面生成表單的代碼和這里表單處理的代碼用If語句封裝,使得這兩部分腳本共享部分公用代碼,比如HTML文檔的頭、數據庫對象的創建和資源釋放等。

  總地看來,dForm.asp只具備了動態表單生成、驗證所必需的核心功能,忽略了許多細節問題的處理。比如前面已經提到的多表單問題:增加一個表管理多個表單,使得腳本具有管理、生成、處理指定表單的能力。另外一個明顯的缺乏是表單定義數據的增加、刪除和更新功能,以及用戶提交結果數據的訪問,這類功能可以在一個獨立的程序中實現,而且在大多數情況下可以做成傳統的應用程序(非B/S結構的應用)。最后,dForm.asp支持的輸入域類型也有限,在實踐中可能會有其他的表單輸入要求,比如專用的e-mail地址輸入框等。然而,對于那些經常要更新表單的網站來說,本文所討論的表單動態生成、動態驗證功能確實是非常有用的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
福利视频第一区| 欧美性猛交xxxx免费看久久久| 亚洲黄色成人网| 欧美极品在线播放| 91国内免费在线视频| 成人免费看吃奶视频网站| 久久久综合av| 中文在线资源观看视频网站免费不卡| 欧美另类老女人| 亚洲国产中文字幕久久网| 亚洲欧美国产va在线影院| 亚州成人av在线| 亚洲欧美国产高清va在线播| 麻豆一区二区在线观看| 日韩影视在线观看| 亚洲电影免费观看高清完整版在线观看| 亚洲国产精品va在线看黑人动漫| 国语对白做受69| 中文字幕欧美日韩在线| 亚洲精品永久免费精品| 久久久久久网址| 日韩免费观看在线观看| 在线看国产精品| 欧美乱妇高清无乱码| 久久香蕉国产线看观看av| 日韩动漫免费观看电视剧高清| 精品国偷自产在线视频| 精品国偷自产在线| 久久影视电视剧免费网站清宫辞电视| 久久这里只有精品视频首页| 68精品国产免费久久久久久婷婷| 欧美网站在线观看| 日韩欧美在线一区| 日韩在线免费高清视频| 一个色综合导航| 亚洲精品欧美日韩专区| 国产精品白嫩美女在线观看| 精品激情国产视频| 久久久www成人免费精品张筱雨| 伊人伊人伊人久久| 日韩欧美极品在线观看| 国语自产精品视频在免费| 日韩在线资源网| xxxx欧美18另类的高清| yellow中文字幕久久| 亚洲国产91色在线| 亚洲自拍偷拍色图| 亚洲影院色无极综合| 亚洲一区二区日本| 欧美高清激情视频| 久久精品国产清自在天天线| 亚洲国产另类 国产精品国产免费| 欧美尤物巨大精品爽| 午夜精品在线观看| 国产日产欧美a一级在线| 久久精品中文字幕电影| 国产精品视频区| 亚洲专区在线视频| 国产在线视频91| 亚洲色图在线观看| 国产精品视频一区二区三区四| 韩国三级日本三级少妇99| 亚洲美女又黄又爽在线观看| 国产精品亚洲欧美导航| 精品国产91久久久久久| 久久久国产精品视频| 亚洲天堂免费在线| 欧美极品少妇全裸体| 亚洲成人久久久| 欧美中文在线视频| 久久久亚洲影院你懂的| 国自产精品手机在线观看视频| 久久91超碰青草是什么| 欧美激情日韩图片| 国产一级揄自揄精品视频| 日韩激情av在线免费观看| 欧美多人爱爱视频网站| 欧美午夜精品久久久久久久| 国产成人亚洲精品| 91久久国产婷婷一区二区| 日韩在线小视频| 国产成人a亚洲精品| 欧美性xxxx极品高清hd直播| 在线精品国产欧美| 日韩一区二区在线视频| 亚洲人成电影在线播放| 亚洲成人黄色网| 精品国产乱码久久久久酒店| 中文字幕亚洲二区| 中文字幕精品一区久久久久| 亚洲性视频网站| 欧美亚洲国产精品| 欧美日韩国产一区二区三区| 欧美成人在线免费| 成人免费视频a| 欧美激情视频在线观看| 国产精品极品在线| 国产精品中文字幕在线| 亚洲日韩欧美视频| 国产精彩精品视频| 日韩一区二区精品视频| 亚洲性视频网址| 欧美色欧美亚洲高清在线视频| 久久夜色精品国产| 亚洲色图18p| 久久久亚洲影院| 日韩av网站导航| 国产视频亚洲精品| 91人人爽人人爽人人精88v| 成人xxxxx| 九九综合九九综合| 午夜免费久久久久| 欧美电影在线观看网站| 中文字幕在线视频日韩| 日韩欧美亚洲成人| 国产精品直播网红| 亚洲欧美日韩中文在线| 久久久在线免费观看| 日韩精品极品视频免费观看| 精品日韩中文字幕| 欧美精品第一页在线播放| 日韩av在线看| 欧美区二区三区| 亚洲二区在线播放视频| 久久久噜久噜久久综合| 欧美日韩国产黄| 亚洲a区在线视频| 国产第一区电影| 亚洲综合国产精品| 亚洲性生活视频在线观看| 亚洲第一精品久久忘忧草社区| 欧美激情精品久久久| 国产成+人+综合+亚洲欧洲| 国产精品女视频| 久久人人爽人人爽人人片亚洲| 欧美大片在线免费观看| 国产精品青青在线观看爽香蕉| 奇米一区二区三区四区久久| 国产日韩精品综合网站| 国产欧美一区二区三区在线看| 欧美在线一区二区三区四| 久久久久成人网| 免费99精品国产自在在线| 黑人极品videos精品欧美裸| 91丝袜美腿美女视频网站| 亚洲第一精品自拍| 欧美日韩国产精品| 亚洲丁香婷深爱综合| 日韩欧美综合在线视频| 最近2019中文字幕第三页视频| 91av中文字幕| 亚洲热线99精品视频| 久久影视电视剧免费网站清宫辞电视| 亚洲福利在线播放| 91精品免费看| 亚洲精品小视频在线观看| 日韩不卡中文字幕| 日韩激情av在线播放| 欧美日本黄视频| 欧美日韩成人黄色| 日韩成人在线视频网站| 久久激情视频免费观看| 欧美美女操人视频| 91精品在线观看视频|