65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.30/5 (7投票s)

2008 年 11 月 27 日

CPOL

7分钟阅读

viewsIcon

30119

downloadIcon

188

EasyForm 允许您创建类似 ASP.NET 的表单,具备状态保持和服务器端事件处理功能。

引言

EasyForm 是一个极其小巧的经典 ASP 库,由两个 ASP 文件组成,代码行数不到 300 行。如果您想实现以下功能,可以使用它:

  • 自动保持 HTML 控件的状态
  • 一种轻松设置和获取控件值、属性和附加数据的简便方法
  • 服务器端事件处理

背景

ASP.NET 技术利用了 .NET Framework 中的数百个类。其强大之处无法与老练的 ASP 相提并论,因此试图用我们喜爱的祖先来模仿其众多功能是没有意义的。即使这可能,我们也会得到一个复杂的新框架。这样的工作将是浪费时间:在有原版的情况下,谁会花时间学习使用一个非标准的克隆呢?然而,经典的 ASP 应用程序仍然存在并需要维护,而且还会有新的应用程序被创建。我的目的是实现一些能够加快创建 ASP 表单所需工作的事情。它必须易于学习、易于使用、轻量级,并且能够在权限受限(不允许自制 COM 对象)的托管环境中运行。  

Using the Code

首先,我建议您下载并运行示例。示例代码非常简单易懂。

两分钟速成教程

EasyForm.aspEncryption.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
  • VarNamestring ,指定变量的名称
  • ControlTypestring ,指定变量将附加到的 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。请参阅 Sample1Sample2

AddOption 方法

AddOption OptionValue

它类似于 Bind 方法,必须与 <option> 元素和 <input type=radio> 一起使用。请参阅 Sample1 和 Sample2

Attributes 集合属性

object.Attributes(AttributeName) = AttributeValue
StringVar = object.Attributes(AttributeName) 

Getset 属性的 string 值。调用 Bind 方法时,对于集合中的每个属性,都会在 HTML 中写入赋值AttributeName="AttributeValue" 。如果属性值为布尔值且为 true,则只写入属性名(例如:readonly, disabled)。集合是状态化的,并存储在加密的隐藏字段中。这意味着如果您设置了任何属性,就不需要在后续的回发中再次设置它们。请参阅 Sample3 和 Sample4

Data 集合属性

object.Data(DataName) = DataValue
StringVar = object.Data(DataName) 

Getset 自定义数据的 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 会执行提交而不调用任何子程序。请参阅 Sample3Sample4

历史

  • 2008 年 11 月 27 日:初始发布
© . All rights reserved.