ASP EasyForm:两分钟内创建类似ASP.NET的表单






4.30/5 (7投票s)
EasyForm 允许您创建类似 ASP.NET 的表单,具备状态保持和服务器端事件处理功能。

引言
EasyForm
是一个极其小巧的经典 ASP 库,由两个 ASP 文件组成,代码行数不到 300 行。如果您想实现以下功能,可以使用它:
- 自动保持 HTML 控件的状态
- 一种轻松设置和获取控件值、属性和附加数据的简便方法
- 服务器端事件处理
背景
ASP.NET 技术利用了 .NET Framework 中的数百个类。其强大之处无法与老练的 ASP 相提并论,因此试图用我们喜爱的祖先来模仿其众多功能是没有意义的。即使这可能,我们也会得到一个复杂的新框架。这样的工作将是浪费时间:在有原版的情况下,谁会花时间学习使用一个非标准的克隆呢?然而,经典的 ASP 应用程序仍然存在并需要维护,而且还会有新的应用程序被创建。我的目的是实现一些能够加快创建 ASP 表单所需工作的事情。它必须易于学习、易于使用、轻量级,并且能够在权限受限(不允许自制 COM 对象)的托管环境中运行。
Using the Code
首先,我建议您下载并运行示例。示例代码非常简单易懂。
两分钟速成教程
将 EasyForm.asp 和 Encryption.asp 复制到您的 Web 应用程序的任何目录中。
使用类似以下的结构创建一个表单页面:
<!--#include file="inc/EasyForm.asp" -->
<%
' --- EasyForm variables Declarations ---
EF.DimVar "email","text"
EF.DimVar "role","select"
EF.DimVar "button1","button"
' --- Call to init method
EF.init
' --- Mandatory handler for onLoad event
sub EF_onLoad()
if EF.IsFirstLoad then
email.value = "type your email"
role.value = "noselection"
end if
end sub
' --- Handler for a button click
sub button1_onclick()
response.write "user email = " & email.value
response.write "<br>user role = " & role.value
end sub
%>
<html>
<body>
<form method="post">
Email
<input type="text" <%email.Bind%> />
<br>
Role
<select <%role.bind%>>
<option <%role.addoption "noselection"%>>Select role...</option>
<option <%role.addoption "cs"%>>C# developer</option>
<option <%role.addoption "cpp"%>>C++ developer</option>
<option <%role.addoption "web"%>>Web developer</option>
</select>
<br>
<input type=button value="Save" <%button1.Bind %> />
<%EF.EndForm%>
</form>
</body>
</html>
即:
- 在您的表单页面中包含 EasyForm.asp。
- 使用
EF.DimVar
声明EasyForm
变量及其控件类型。 - 调用
EF.init
方法。 - 定义
EF_onLoad
子程序,并编写初始化代码。 - 使用变量的
Bind
和/或AddOption
方法将每个 HTML 控件附加到一个EasyForm
变量。除按钮外,不要为控件指定name
和value
属性。当您将EasyForm
"button
" 变量附加到按钮控件时,必须为该button
的单击事件定义一个处理程序。Sample1
和Sample2
演示了如何将各种 HTML 控件附加到EasyForm
变量。 - 在表单的结束标签之前调用
EF.EndForm
。
告诉我更多信息
EasyForm.asp
EasyForm.asp 文件定义了 EasyForm
和 EFVariable
两个类,然后创建了一个名为 EF
的 EasyForm
类实例,以便在您的页面中使用。
Encryption.asp
此文件包含在 EasyForm.asp 中。这里我们有 EF_Encrypt
和 EF_Decrypt
函数,用于在内部对隐藏字段中存储的数据进行简单的加密。如果需要,请替换它们。
EF 对象
EF
对象是当您包含 EasyForm.asp 文件时自动创建的 EasyForm
类的实例。
EF.DimVar 方法
EF.DimVar VarName, ControlType
VarName
:string
,指定变量的名称ControlType
:string
,指定变量将附加到的 HTML 控件的类型。
可能的值包括:"button
"、"checkbox
"、"hidden
"、"password
"、"radio
"、"select
"、"text
"、"textarea
"、" ,"generic
"、"literal
"
声明一个 EasyForm
变量。 EasyForm
变量是 EFVariable
类的实例。您必须使用 EF.DimVar
方法创建它们。创建时,每个变量会从已发布的(posted)数据中读取其值(如果存在),匹配您通过 EF.DimVar
声明的名称。否则,默认为一个空 string
或您在 EF_onLoad
子程序中分配给它的值。
声明后,EasyForm
变量名将存在于全局作用域中。您可以使用它,就像使用任何其他对象变量一样。
如果您声明一个名为 MyButton
的 "button
" 变量并将其附加到按钮控件,那么您必须为该按钮的单击事件定义一个名为 MyButton_OnClick
的处理程序。在更复杂的情况下,您可以使用 EF_Call
JavaScript 函数,而不是附加 "button
" 变量。
"generic" 类型允许您将 EasyForm
变量附加到通用的 HTML 元素。这对于将数据附加到元素或在服务器端代码中设置其属性很有用。
Literals
是特殊的 EasyForm
变量,无需附加到控件或元素。Literals 类似于经典变量,但它们能够通过加密的隐藏字段记住其值在后续的表单回发(postbacks)中。
EF.init 方法
必须在 EasyForm
变量声明后调用它。此方法调用 EF_onLoad
子程序,并在触发事件时调用相关的处理程序。如果您需要在 EF_onLoad
或其他处理程序中使用一些全局变量,请在调用 EF.init
之前声明并初始化这些变量。
EF.EndForm 方法
必须调用它。此方法向表单添加一些隐藏字段和 EF_Call
JavaScript 函数,以便保存控件状态并向服务器端触发事件。在表单的结束标签之前调用它。
EF.IsFirstLoad 属性
布尔只读属性。当页面首次加载时,其值为 true
。
EF_onLoad 子程序
您必须定义此子程序,即使它可能为空。 EasyForm
变量的初始化代码应放在此处。此子程序在每次页面加载时都会被调用,您可以使用 EF.IsFirstLoad
属性来区分首次加载和回发(postback)。这对于防止您的初始化代码在回发后覆盖用户输入很重要。您通过变量的 Value
属性来 get
和 set
EasyForm
变量的值。
EFVariable 类
EasyForm
变量是 EFVariable
类的实例。它的属性和方法使其易于与 HTML 控件配合使用。当您将 EFVariable
附加到 HTML 控件时,您无需担心在后续的回发中保持控件状态。 EFVariable
会为您处理。您必须使用 EF.DimVar
声明 EFVariable
。
Value 属性
Value
属性允许您 get
和 set
变量的 string
值。根据变量附加到的 HTML 控件的类型,该值将以正确的方式呈现。
Bind 方法
Bind
方法将变量附加到控件。您必须在控件的 HTML 标签中调用 Bind
方法。此方法在控件 HTML 中注入变量名作为控件的 name 属性。此外,根据 controltype
,它会编写 HTML 来设置控件的当前值。如果您使用变量的 Attributes
属性设置了某些属性,那么 Bind
方法会将(AttributeName
, AttributeValue
)对注入到控件中。对于 <radio>
和 <option>
标签,请改用 AddOption
。
注意:<select>
标签仍然需要调用 Bind
。请参阅 Sample1 和 Sample2。
AddOption 方法
AddOption OptionValue
它类似于 Bind
方法,必须与 <option>
元素和 <input type=radio>
一起使用。请参阅 Sample1 和 Sample2。
Attributes 集合属性
object.Attributes(AttributeName) = AttributeValue
StringVar = object.Attributes(AttributeName)
Get
和 set
属性的 string
值。调用 Bind
方法时,对于集合中的每个属性,都会在 HTML 中写入赋值AttributeName="AttributeValue"
。如果属性值为布尔值且为 true
,则只写入属性名(例如:readonly
, disabled
)。集合是状态化的,并存储在加密的隐藏字段中。这意味着如果您设置了任何属性,就不需要在后续的回发中再次设置它们。请参阅 Sample3 和 Sample4。
Data 集合属性
object.Data(DataName) = DataValue
StringVar = object.Data(DataName)
Get
或 set
自定义数据的 string
值。与属性不同,自定义数据不会自动写入 HTML。集合是状态化的,并存储在加密的隐藏字段中。
对于 select
和 radio
控件,可以使用选项的值作为索引来索引数据名称。您可以使用 value
关键字获取与控件选定选项对应的数据值。
object.Data(DataName[optionValue]) = DataValue
StringVar = object.Data(DataName[value])
请参阅 Sample4。
EF_Call JavaScript 函数
EF_Call ( ServerSideSub [, Argument])
在客户端调用,执行 ServerSideSub
参数指定的服务器端子程序。如果您指定了 Argument
,则该子程序必须接受一个参数。使用空 string
调用 EF_Call
会执行提交而不调用任何子程序。请参阅 Sample3 和 Sample4。
历史
- 2008 年 11 月 27 日:初始发布