ASP.NET与FLASH交互学习了ASP.NET的基础知识之后,终于等到学习交互的时候了。请大家和我一起来进行让人激动的交互吧!本章我将用两个简单的Demo示例向读者展示Flash和ASP.NET交互原理以及过程,请大家和我一起完成它,为了给下章成型示例打基础,学习操作ASP.NET对Cookie和Session的操作也是必不可少的。

10.1 用Visual Studio 2005创建ASP.NET程序

10.1.1使用Visual Studio软件返回字符串

接下来让我们尝试一下Visual Studio 2005中超级体贴、超级简单的读取数据方法。你只需轻点几下鼠标就可以完成以往繁重的手工编程:打开Visual Studio 2005 软件,在菜单栏选择“文件”→“新建”→“网站”,如图10.1所示:

图10.1

在弹出的类型选择框中,选择默认的“ASP.NET网站”,如图10.2 所示

图10.2

在选择框的左下方有文件保存的位置,默认是“我的文档”的文件夹里,鉴于一般读者的“我的文档”都放在系统盘内,重新恢复系统会清空文件。强烈建议读者把文件保存在一个不易丢失的位置;语言我们选择C#,如图10.3所示:

图10.3

一阵读写磁盘的噪音之后,终于出现编辑界面。我们会看到最右侧的解决方案管理器内出现了“解决方案 WebSite1 (1个项目)”的标识,如果读者没有看到“解决方案资源管理器”面板,可以在菜单上点击“视图”→“解决方案资源管理器”,使之出现。

点击Default.aspx左边的+号图标展开节点,可以发现Default.aspx下包含Default.cs 。这就是Default.aspx的逻辑代码,可见Visual Studio 2005在样式与逻辑分离工作方面做的相当人性化。如图10.4所示:

图10.4

接下来我们就测试一下刚才安装的软件和配置的环境是否成功。首先在Default.aspx左下角选择“设计”的编写方式,如图10.5所示:

图10.5

把鼠标放在左侧偏上的“工具箱”按钮上,编辑区将滑出工具箱菜单。如图10.6所示:

图10.6

第一次打开工具箱的读者肯定会被Visual Studio 2005庞大的工具箱吓坏,工具箱里的工具称为“控件”,其作用与Flash提供的“组件”极其类似。但Flash中组件的数量与Visual Studio 2005的控件数量相比,很明显是小巫见大巫。在这个例子中,我们需要把一个Label控件拖到编辑区,拖动完毕,单击填加的控件,编辑区的效果如图10.7所示:

图10.7

在“属性”窗口里(如果没有看到,可以在“视图”-“属性窗口”中打开)我们可以浏览及更改这个Label控件的属性,如图10.8所示:

图10.8

图10.8表示,Label控件的默认值是Label,id是Label1,你可以自行更改,本例中,我让它的默认值为空,id修改为myLB。

双击Label控件,自动进入页面的逻辑代码Default.aspx.cs如图10.9所示:

图10.9

解释一下:上面的using System; 等一系列代码,指的是导入命名空间。Flash 8中的import用法与之类似,在ASP.NET中,如果使用某个类,必须导入此类的命名空间,例如,你要操作XML对象,则要在加一行 using System.Xml;

接下来是对类的定义,我们这个Default.aspx页面引用的是“_Default类”,它属于System.Web.UI的Page子类。其子节点包含一个受保护的事件 Page_Load(当页面被载入时)。我们可以在代码块中间填写想要实现的效果,例如让Label1控件显示“Hello World!”的代码是

myLB.text= "Hello World! ";

加入代码后,点击“文件”→“保存Default.aspx.cs”,然后切换到Default.aspx的编辑页面,点击“文件”→“保存Default.aspx”。

保存完毕之后点击“文件”→“在浏览器中查看”,即可调试页面。效果如图10.10所示:

图10.10

10.1.2配置数据源连接数据库

第二个例子我们要连接刚才创建的数据库,并让数据表中的字段值显示在页面中。在这之前,我们有必要了解一下Visual Studio 2005中的数据组件:首先,把鼠标放到左上角“工具箱”按钮上,选择点击“数据”选项卡,你将会看到很多数据控件,如图10.11所示:

图10.11

我们要用到的控件是SqlDataSource和GridView。其中SqlDataSource控件的作用是连接SQL Server数据库,并生成查询语句,而GridView则被用做显示返回的数据。

在“解决方案资源管理器”中的地球图标上点右键,选择“填加新项”,如图10.12所示。在弹出的命名窗口中,填写新页面的名字,本例中使用showData.aspx

图10.12

首先把showData.aspx页面编辑方式切换为“设计”,然后在工具箱内的“数据”选项卡里把一个SqlDataSource控件拖入showData.aspx页面,SqlDataSource控件会要求你配置数据源,如图10.13所示:

图10.13

点击“配置数据源”文字连接,将弹出“配置数据源”选项卡,如图10.14所示:

图10.14

我们单击“新建连接”按钮,弹出如图10.1.15的选项卡,我们选择第三项,Microsoft SQL Server,按继续:

图10.15

在弹出的“填加连接”选项卡中,我们点击“服务器名”的下拉菜单,经过几秒钟的读取,会出现两个,第一个是“SQL Server”,因为我们利用的是Visual Studio 2005自带的数据库引擎精简版:“SQLEXPRESS”,并没有安装SQL Server,所以你要选择第二项,如图10.16所示:

图10.16

选择第二项之后,在下边的验证方式里选择“使用SQL Server身份验证”,在用户名中和密码中填写你设定的值,本例中用户名是myTester,密码是abcdefg。如图10.17所示:

图10.17

下面的“连接到一个数据库”选项卡内的下拉菜单被激活,点击下拉菜单,选择我们建立的数据库myTesterDB,如图10.18所示:

图10.18

点“确定”按钮,又是一阵硬盘读取声,几秒之后,回到了“配置数据源”窗口,我们刚才连接的数据源已经显示在“配置数据源”窗口中,如图10.19所示:

图10.19

点击“下一步”按钮。在弹出的选项卡中选择将此连接保存到“应用程序配置文件中”。以后再连接数据库时只需要鼠标在这个下拉菜单中点选就直接使用,免掉很多重复步骤。

10.1.3 体贴的SQL语句选择功能

在保存数据连接之后,接着点“下一步”,进入配置Select语句选项卡中。Visual Studio 2005在这一步中简化了开发者的工作,我们可以通过简单的鼠标选取来构造SQL语句。

本例中我选择了myTable表,并选取了myUsername字段、myPoints字段和selfIntro字段,如果我想对这些数据加上限定条件,则可以点击“WHERE……”按钮,如果我想对返回的值排序,可以点击“ORDER BY……”按钮。选定后在SELECT语句框中出现如图10.20所示的语句:

图10.20

在这个例子中我希望对数据进行排序,按照myPoints的降序。点击“ORDER BY……”按钮,如图10.21所示:

图10.21

按“确定”,即可看到按照刚才要求生成的SQL语句,如图10.22所示:

图10.22

10.1.4利用控件读取SQL Server数据库中的值

本节我们将利用Visual Studio 2005中的控件显示数据库中的值,接着点击“下一步”按钮,按“测试查询”按钮,可以立即看到刚才设定的效果,这是个相当体贴的功能!。如图10.23所示:

图10.23

测试无误,点击“完成”按钮,结束配置数据源。接下来,我们在Default.aspx的“设计”模式下,拖入一个GridView控件(功能类似于Flash里的DataGrid组件),点击“选择数据源”的下拉菜单,选择我们刚才创建的数据源,如图10.24所示:

图10.24

保存页面,然后“文件”→“在浏览器中查看”,就会得到如图10.25所示的效果,整个过程,基本没打一行代码!微软编辑器的亲和力果然厉害!如果你观察仔细,还会发现,在GridView下部竟然还有便捷的分页功能!!!

图10.25

我用两个示例向你演示了Visual Studio 2005软件和SQL数据库的无缝嵌合,事实上,在Flash和ASP.NET的通信中,我们只是让ASP.NET动态的生成XML文件,然后通过Flash对XML的遍历获得结果显示给读者。

ASP.NET是一种完全面向对象编程的优秀语言,Flash ActionScript 2.0编程思想也与之类似。类库是编程的基本条件,一切实例均是某类的实例,而ASP.NET的类库具有5000余个类,本书不能一一介绍,只能针对Flash RIA比较有用的传值、数据库相关介绍。

10.2 两个Demo示例

10.2.1 Demo示例(1):读取ASP.NET返回的值

本节我们将讲解用Flash与ASP. NET交互的基本知识。首先我们在“解决方案资源管理器”面板内的地球标识上点右键,选择“填加新项”,在弹出的命名选项卡中,我们给页面命名为load.aspx,同上节一样,填加之后点击页面左边的+号,即可展开其逻辑代码load.aspx.cs。进入load.aspx的编辑界面,在左下角选择“源”的编辑方式。把除第一句以外的所有代码都删除,第一句修改如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="load.aspx.cs" Inherits="load" CodePage="65001"%>

解释一下这句代码,在ASP章已经学过,一个完整的ASP页包含若干“声明”:文档类型声明、编码声明等等。本句就是ASP.NET中的声明:“<%” 表示HTML页面中ASP.NET代码的开始“%>”表示HTML页面中ASP.NET代码的结束。其他声明的解释如下表:

ASPX页声明

解释

@Page Language="C#"

表示页面后台语言是C#

AutoEventWireup="true"

绑定事件功能开启(可以用”Page_Init”和”Page_Load”事件)

CodeFile="load.aspx.cs"

逻辑代码是load.aspx.cs

Inherits="load"

引用类load

CodePage="65001"

编码方式UTF-8

由于我们通过XML和Flash交互,所以我们删除了load.aspx中所有的HTML代码,让逻辑代码包办一切输出行为。进入逻辑代码load.aspx.cs,并开始构造思路:我们想让Flash用loadVariables,LoadVars.load和XML.load向load.aspx提出请求,利用myMethod这个GET参数,作为不同请求的标识。load.aspx把参数值送交逻辑层分析选择,最后由逻辑层负责返回相应的结果:

1.    如果myMethod值为空,则load.aspx返回字符串:请求为空。

2.    如果myMethod值为loadvariables,则load.aspx返回字符串:theValue=这个方式是loadVariables!

3.    如果myMethod值为loadvars,则load.aspx返回字符串:“theMethod=这个方式是loadVars&theData=利用字符串Flash与ASP.NET通信”

4.    如果myMethod值为xml,则返回一个XML文档:“<?xml version='1.0' encoding='utf-8'?><data method='这个方式是xml'>利用XML,Flash与ASP.net通信</data>”

看过上面的思路分析,学过程序设计的读者几乎都会选择switch语句:这种分支选择问题,switch语句最为方便,思路也最清晰。下面是逻辑代码:

/*--------------------------------------------------------------------------------------------------------------------------------

以下诸句表示的是导入命名空间,每个页面被创建时,Visual Studio软件自动为我们创建的,如果我们还需要处理其他类的实例,可以导入其他命名空间

---------------------------------------------------------------------------------------------------------------------------------*/

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

public partial class load : System.Web.UI.Page

{

//你应该记得load.aspx中引用的是load类,在此处我们来定义它

protected void Page_Load(object sender, EventArgs e)

{

//因为load.aspx中,AutoEventWireup属性被设置为true,所以我们可以使用Page_Init和Page_Load事件,Page_Load是当页面被载入时触发的事件

/*---------------------------------------------------------------

以上诸行代码是编程常用的switch语句,在多条件的选取中,它结构清晰不易混乱。

本例中,我对由GET方式提交过来的myMethod进行选择判断。在ASP.NET中,外部提交的数据,可以按Request["myMethod"]这样的形式接收。

---------------------------------------------------------------*/

switch (Request["myMethod"])

{

case "":

Response.Write("请求为空");

break;

case "loadvariables":

Response.Write("theValue=这个方式是loadVariables!");

break;

case "loadvars":

Response.Write("theMethod=这个方式是loadVars&theData=利用字符串Flash与ASP.NET通信");

break;

case "xml":

Response.Write("<?xml version='1.0' encoding='utf-8'?><data method='这个方式是xml'>利用XML,Flash与ASP.net通信</data>");

break;

default:

Response.Write("请求为空");

break;

}

}

}

保存,在浏览器中查看将得到图10.26 – 10.29所示:

图10.26

图10.27

图10.28

图10.29

* 注:这个例子的源文件,在附带光盘下:源文件\第十章\1\load.aspx和load.aspx.cs

从结果来看,测试是成功的!!!接下来该做Flash的部分了,废话不说,打开Flash Professional 8软件,趁它疯狂读硬盘的时候,我们放松一下大脑,顺便来设计一下Flash的设计思路。

10.2.2在Flash中用三种方式显示ASP.NET返回的值

类似于前面的例子,我们仍然用一个ComboBox组件来选择读取方式,用一个TextArea组件来显示结果。

首先我们用dataProvider给ComboBox填充文字和初始值,最后给它增加监听器,使之一旦改变,switch函数就执行判断,并执行相应函数。代码如下:

//声明myComboBox为一个新的ComboBox组件

var myComboBox:mx.controls.ComboBox;

//声明myTextArea为一个新的TextArea组件

var myTextArea:mx.controls.TextArea;

//给myComboBox增加数据源

myComboBox.dataProvider = [{data:0, label:"点击选择"}, {data:1, label: "loadVariables方式"}, {data:2, label: "loadVars方式"}, {data:3, label: "XML方式"}];

/*---------------------------------------------------------------------------------------------------------------------------------

为myComboBox组件增加监听事件,从这你应该看出第一章学习Flash监听机制的好处。Switch语句被用在Flash里判定myComboBox组件变化后的值:如果值为1,则用loadVariables方法,如果值为2,则用loadVars方法,如果值为3则用XML.load方法

--------------------------------------------------------------------------------------------------------------------------------*/

//为myComboBox定义监听函数

var listenerObject:Object = new Object();

//当myComboBox改变选项时

listenerObject.change = function(eventObject:Object) {

//选择comboBox的值

switch(eventObject.target.value){

//如果是1,执行firstMethod方法

case 1: firstMethod();break;

//如果是2,执行secondMethod方法

case 2: secondMethod();break;

//如果是3,执行thirdMethod方法

case 3: thirdMethod();break;

//默认情况什么都不做

default:0;break;

}

};

//为myComboBox增加监听函数

myComboBox.addEventListener("change", listenerObject);

/*-----------------------------------------------------------------------------------------------------------------------------

由于loadVariables没有onLoad触发事件,所以我们只能不停的利用setInterval一次次的使用checkIt函数检测,一旦读入的_root.theValue值不为空,才删除setInterval,显示读到的值

------------------------------------------------------------------------------------------------------------------------------*/

function firstMethod():Void{

loadVariables("load.aspx?myMethod=loadvariables",_root, "GET");

function checkIt() {

if (_root.theValue == undefined) {

myTextArea.text = "Loading... ";

} else {

myTextArea.text = _root.theValue;

clearInterval(myInterval);

}

}

var myInterval:Number = setInterval(checkIt, 100);

}

//定义secondMethod函数

function secondMethod():Void{

//myTextArea组件显示“Loading……”字符串

myTextArea.text = "Loading... ";

//建立myLoadVars为一个新的LoadVars对象

var myLoadVars:LoadVars = new LoadVars();

//定义myLoadVars的onLoad函数

myLoadVars.onLoad = function(success:Boolean):Void{

//如果读取成功

if(success){

//在myTextArea显示myLoadVars的theMethod属性和theData属性

myTextArea.text=myLoadVars.theMethod+"\n\n"+myLoadVars.theData;

}else{

//如果读取失败,现在错误信息

myTextArea.text = "文件传输错误";

}

}

//myLoadVars读取同目录下的文件,为了防止读取缓存,在地址后加了一个随机数。

myLoadVars.load("load.aspx?myMethod=loadvars&temp="+Math.random());

}

//定义第三种方式thirdMethod,也就是XML读取

function thirdMethod():Void{

//myTextArea组件显示“Loading……”

myTextArea.text = "Loading... ";

//声明myXML为一个新的XML对象

var myXML:XML = new XML();

//声明myXML忽略空白节点

myXML.ignoreWhite=true;

//定义myXML的onLoad函数

myXML.onLoad =function(success:Boolean):Void{

//如果读取成功

if(success){

//myTextArea组件显示myXML的值

myTextArea.text = myXML.toString();

//如果读取失败

}else{

//显示错误信息

myTextArea.text = "文件传输错误";

}

}

//myXML读取同目录下的文件,为了防止读取缓存,在地址后加了一个随机数。

myXML.load("load.aspx?myMethod=xml&temp="+Math.random());

}

*注:这个例子的源文件,在附带光盘下:源文件\第十章\1\4-1-1.fla,版本为Flash 8,请勿用低于Flash 8版本软件打开。

注意:这个例子我们为了兼顾扩展性,采取了相对路径,所以要把SWF文件导出到和load.aspx页面同一层文件夹内。我建议,所有源文件最好都层级有序地放入同一个顶层文件夹内。这样更有利于你对整个工程的支配。

图10.30为我解决方案管理器的截图:

图10.30

在浏览器中以虚拟路径访问4-4-1.html或4-4-1.swf都可以显示本例效果。图10.31为展开myComboBox但尚未选择的效果:

图10.31

图10.32所示为选择loadVariables选项时的效果:

图10.32

图10.33所示为选择loadVars选项时的效果:

图10.33

图10.34所示为选择XML选项时的效果:

图10.34

10.2.3 Demo示例(2)利用Flash读取SQL Server数据库的值(1)

本节我们来练习用Flash读取SQL Server数据库中的值,思路如下:用ASP.NET连接读取数据库,并生成XML列表,Flash去读取XML列表并且格式化结果显示在组件中。

在Visual Studio 2005“解决方案资源管理器”的地球图标上点右键,选择“添加新项”,在弹出的窗口将之命名为xml_list.aspx,稍等片刻,工作区将自动转向该页面,同时在“解决方案资源管理器”内xml_list.aspx下可以展开其逻辑代码xml_list.aspx.cs。因为输出文档类型为text/xml,所以我们把list.aspx除第一行以外的所有代码都删除,且增加两个参数,修改后第代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="xml_list.aspx.cs" Inherits="xml_list" ContentType="text/xml" CodePage="65001"%>

保存为xml_list.aspx即可,新手朋友还可以再增加一个参数 debug=true,这样在程序出错时就会有具体的错误提示,不过记得,发布之前删除为好。接着双击xml_list.aspx.cs进入逻辑代码,把以下代码输入到文件中:

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

//引入SQL命名空间,这是使用SQL Server 客户端必需的

using System.Data.SqlClient;

//定义被引用的xml_list类

public partial class xml_list : System.Web.UI.Page

{

//声明公有变量sql

public string sql;

protected void Page_Load(object sender, EventArgs e)

{

//设定strConnection为数据库连接字符串

string strConnection = "Data Source=(local)\\SQLEXPRESS;Initial Catalog=myTesterDB;User ID=myTester;Password=abcdefg; ";

//建立一个SQL连接,连接字符串strConnection作为一个参数

SqlConnection objConnection=new SqlConnection(strConnection);

//连接应处于“打开“状态,否则一切操作都是徒劳的。

objConnection.Open();

//设置SQL语句,读取myTable中的5条数据

sql = "SELECT top 5 * FROM [myTable] ORDER BY [myPoints] DESC+ ";";

//建立一个SQL命令对象,它有两个参数:第一个是命令即SQL语句,第二个是连接名

SqlCommand cmd = new SqlCommand(sql,objConnection);

//ASP.NET最快的读取方式:SqlDataReader,与ASP中的“1,1”有些类似,都是快速的,只读的

SqlDataReader dr = cmd.ExecuteReader();

//输出XML头,XML根节点设置,其中包括:总记录数、总页数、当前页、管理状态

Response.Write("<?xml version='1.0' encoding='utf-8'?><数据>");

//while(dr.Read)相当与“有符合的记录就执行一次”,类似于ASP的rs.MoveNext+LOOP

while(dr.Read()){

/*---------------------------------------------------------------------------------------------------------------------

每读取一次就输出一个子节点,类似于ASP要读取RecordSet中的name值用rs("name")一样,ASP.NET要读取DataReader中的name值,用dr["name"];

---------------------------------------------------------------------------------------------------------------------*/

Response.Write("<资料 用户名='"+dr["myUsername"]+"' 积分='"+dr["myPoints"]+"'介绍='"+dr["selfIntro"]+"'/>");

}

//输出XML结尾

Response.Write("</数据>");

//释放连接所耗资源

objConnection.Dispose();

//连接关闭

objConnection.Close();

//释放命令所耗资源

cmd.Dispose();

//释放DataReader所耗资源

dr.Dispose();

//DataReader关闭

dr.Close();

}

}

保存文件为xml_list.cs,在“解决方案资源管理器”中浏览xml_list.aspx效果如图10.35所示:

图10.35

* 注:该示例的源文件在光盘 第十章\2\xml_list.aspx和xml_list.cs

10.2.4 Demo示例(2)利用Flash读取SQL Server数据库的值(2)

本节只需利用Flash读取ASP.NET取回的XML值即可完成一个简单的交互示例。在Flash软件中新建一个文档,拖入主场景一个TextArea组件,并命名为myTextArea,它用来显示结果,在Flash文档的动作面板中输入以下代码:

var myTextArea:mx.controls.TextArea;

var myXML:XML=new XML();

myXML.ignoreWhite=true;

myXML.onLoad=function(success:Boolean):Void{

if(success){

var root:XMLNode=this.firstChild;

for(var i:Number=0;i<root.childNodes.length;i++){

myTextArea.text+="用户名:"+root.childNodes[i].attributes.用户名+"\t";

myTextArea.text+="积分:"+root.childNodes[i].attributes.积分+"\t";

myTextArea.text+="介绍:"+root.childNodes[i].attributes.介绍+"\t";

myTextArea.text+="\n\n";

}

}

}

myXML.load("http://localhost:38960/WebSite1/xml_list.aspx ");

保存文件,调试代码,效果如图10.36所示:

图10.36

* 注:此示例的源文件在 第十章\2\xml_list.fla

10.3 ASP.NET的Cookie和Session

10.3.1 ASP.NET中的Cookie

通过上一部分的学习,我们已知道:Cookie是ASP中的一个对象集合,它以加密的形式被保存在客户端特定文件夹内,用户可以修改、删除甚至伪造Cookie;而Session是一个服务器对象,它被保存在服务器,所以相对地,使用Session较为安全,但较耗费服务器资源。你可以随意设置Cookie的生存期,例如1年。但如果你让一个Session变量始终生存在服务器主机内,对你的服务器来说并不是一个好的选择,通常来讲,涉及到“管理权限”的时候才会用Cookie+Session双认证。

首先我们还是在ASP.NET中练习写入和读取Cookie和Session,了解一些Cookie的基本知识:Cookie对象是.NET Framework中HttpCookie类实例化的模型。下面我们来学习ASP.NET中与Cookie密切相关的一些方法:

1.         如何建立Cookie:ASP.NET建立Cookie的标准代码写法是

HttpCookie myCookie = new HttpCookie("someCookie");

这句代码建立了一个名为myCookie的Cookie对象

2.         接收Cookie对象:接收ASP.NETCookie对象的标准代码写法是

HttpCookie getCookie = Request.Cookies["someCookie"];

设置getCookie为一个Cookie对象,它是请求页面中Cookie对象数组中someCookie的子集。如果名为someCookie的Cookie数组不存在,则getCookie的null属性为true。

3.         给Cookie增加键值:ASP.NET增加键值的标准代码写法是

myCookie.Values.Add("auth", "admin");

给名为myCookie的Cookie对象(必须实现建好)增加一个auth键名,其值为admin。

4.    附加键值,使Cookie生效:标准代码格式为

Response.Cookies.Add(myCookie);

上句代码把名为myCookie的对象附加到Cookie数组内。注意,在设定Cookie完毕之后一定要加上这句代码才能生效,

4.         设定生存期:设置生存期的标准代码形式如下

myCookie.Expires = DateTime.Now.AddDays(3);

设定名为myCookie的Cookie对象生存期为当前时间加上3天。需要注意的是,设定Cookie之后如果页面不刷新,是不会显示任何效果的。

5.         获取Cookie的值:获取Cookie值的标准代码格式为

myCookie.Values["auth"];

上句代码可以获取名为myCookie的Cookie对象键名为auth的键值。如果不存在,则返回null。

10.3.2 ASP.NET中练习使用Cookie

在Visual Studio 2005“解决方案资源管理器”内的地球图标点右键→“添加新项”,在弹出的窗口中把文件名命名为Cookie.aspx,按“确定”按钮,片刻之后,“解决方案资源管理器”里便出现了新添加的页面文件Cookie.aspx和逻辑文件Cookie.cs。我们首先在HTML状态下弄懂ASP.NET Cookie的使用方法,只要原理弄懂,在Flash RIA工程中只要使输出文档类型由HTML变为XML就万事大吉了。

为了增加读者的实际动手能力,我们在示例中选用了一个广为人知“BBS登录系统”,相信所有泡过BBS论坛的朋友对此都不陌生

图10.37所示为国内Flash门户网站“闪吧 http://www.flash8.net”的登录系统,这个登录系统主要包含几个部分:“用户名、密码”输入框、“有效期”下拉菜单,“登录”按钮。上述一切都被包含到一个表单标签中,一旦“登录”按钮被按下,输入框和下拉菜单中的值就会以POST的方式提交给后台页面加以验证。

图10.37

我们为了模拟这种效果,需要在Visual Studio 2005的“工具箱”中向工作区拖入一个Panel组件(ID命名为myPanel)、两个TextBox组件(ID分别命名为myUID和myPWD)、一个Button组件(ID命名为myBTN)、一个DropDownList组件(ID命名为myDDL)和一个LinkButton组件(ID命名为myLB)。并且我们需要把 除LinkButton以外的其他组件都拖入Panel内。Panel是“群组”组件,其他组件一旦被拖入Panel组件,我们就可以通过控制Panel组件统一管理被它包含的组件。例如,在本例中只需写一句 myPanel.Visible = false;就可以让所有包含在myPanel组件中的所有组件不可见。在myUID和myPWD组件的前面分别添加提示文字:“用户名”和“密  码”;在myLB的“属性窗口”中添加它的Text属性为“退出系统”;单击myDDL组件,在右侧“属性窗口”里找到“杂项”→Items表格,单击(collection)右侧的“...”按钮,为myDDL下拉菜单绑定数据源(这和Flash里的ComboBox很像),如图10.38所示:

图10.38

在弹出的窗口,按图10.39所示填写:

图10.39

其中我们可以通过“添加”一个选项、每个选项都右4个属性Enabled(是否可以选择)、Selected(是否默认就处于“被选中”状态。注意:最多只能有一项可以设置为“true”)、Text(下拉列表的文字)、Value(下拉列表的值)。四个成员的属性设置如下表所:示

ID属性

成员

Enabled

Selected

Text

Value

0

True

True

不保存

no

1

True

False

一天

oneday

2

True

False

一周

oneweek

3

True

False

一个月

onemonth

各组件摆放位置如图10.40所示:

图10.40

页面文件编辑完毕,下面我们该考虑如何编写逻辑文件,思路如下:

每当页面被加载时,逻辑文件首先判定本页是被POST方法请求而访问的,还是被直接访问的。如果是前者,则要接收POST方法传过来的用户名和密码值,并与正确值对比;一旦用户名和密码值错误,则清空所有Cookie,返回本页;如果用户名密码正确,则赋予浏览者相应的Cookie及有效期。按下“退出系统”按钮,后台逻辑脚本负责清空上一Cookie。在“解决方案资源管理器”中双击逻辑文件Cookie.cs,如图10.41:

图10.41

10.3.3 Cookie.aspx的逻辑代码

在Cookie.cs中输入以下代码:

/*--------------------------------------------------------------------------------------------------------------------------------

以下诸句为Visual Studio 2005 创建每个逻辑文件而自动生成的代码,即引用了可能在编程中使用的一些类,这和Flash类文件中的“import ……”很相似:引用类的实例之前必须要事先引用类。

---------------------------------------------------------------------------------------------------------------------------------*/

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

/*--------------------------------------------------------------------------------------------------------------------------------

下句也是软件自动生成的代码,默认情况下,你的.aspx的前缀叫什么名,就引用逻辑文件的什么类,本例Cookie.aspx即引用Cookie类,冒号代表左边是右边的子类。本例中Cookie类属于System.Web.UI.Page的子类。

---------------------------------------------------------------------------------------------------------------------------------*/

public partial class Cookie : System.Web.UI.Page

{

/*--------------------------------------------------------------------------------------------------------------------------------

因为我们要接收用户名、密码、Cookie生存期的值,所以必须事先声明变量。我们分别声明了两个“string”字符串类型变量:uid和pwd和int整形变量exp_time。为了防止浏览器读取可恶的缓存,我们还要声明一个随机数作为URL地址后面的随机参数。

---------------------------------------------------------------------------------------------------------------------------------*/

private string uid;

private string pwd;

public int exp_time;

Random r = new Random();

/*-----------------------------------------------------------------------------------------------------------------

下句为Visual Studio 2005 软件自动生成的代码,前边我们提到过Page_Load是一个触发事件,即“当页面被加载”。它在当页面文件第一句AutoEventWireup为true时可以被逻辑文件使用。一旦我们需要有在页面加载时初始化的设置时统统可以写在这个代码块内。

------------------------------------------------------------------------------------------------------------------*/

protected void Page_Load(object sender, EventArgs e)

{

/*-----------------------------------------------------------------------------------------------------------------

以下前两句分别声明了两个HttpCookie类的实例:myCookie(用于存储Cookie)和Cookie(用于读取Cookie),someCookie是本例Cookie的名称。由于默认情况下浏览者是未登录的,所以根本谈不上退出系统,myLB组件的Visible(可见性)属性当然也要设置为false,以上是初始化代码。

------------------------------------------------------------------------------------------------------------------*/

HttpCookie myCookie = new HttpCookie("someCookie");

HttpCookie Cookie = Request.Cookies["someCookie "];

myLB.Visible = false;

if (!IsPostBack)

/*-----------------------------------------------------------------------------------------------------------------

注意:上面的代码比较常用,意为 “如果(不是 被POST方式提交的)”,它被用于判断本页面是否为被“POST”方法。如果本句返回“true”,则不是被“POST”请求方式提交的。

------------------------------------------------------------------------------------------------------------------*/

{

//如果本页Cookie对象不为空,则向下进行

if (Cookie != null)

//如果本页Cookie对象名为auth的值为admin

{

if (Cookie.Values["auth"] == "admin")

//返回登录信息,群组面板不可见,LinkButton组件可见

{

Response.Write("你已登录系统");

myPanel.Visible = false;

myLB.Visible = true;

}

}

else

{

//如果没有登录成功,则群组面板可见

myPanel.Visible = true;

}

}

else

//如果!IsPostBack的结果为false,即本页是POST请求过来的

{

//uid变量的值为myUID输入框的值

uid = Request.Form["myUID"];

//pwd变量的值为myPWD输入框的值

pwd = Request.Form["myPWD"];

/*---------------------------------------------------------------------------------------------------------------------------------

如果uid和pwd的值分别满足我们设定的值,则执行以下代码。注意:为了让新手理解思想,我在这里没有连接数据库取出用户“lau”的密码,而是直接赋值。

-------------------------------------------------------------------------------------------------------------------------------*/

if (uid == "lau" && pwd == "abcdefg")

{

//声明一个字符串变量exp,它被用做接收myDDL组件选择的生存期

string exp = myDDL.SelectedItem.Value;

//利用switch函数选择exp变量的值

switch (exp)

{

//如果用户选择的是第一项不保存,则exp_time的值为0

case "no": exp_time = 0; break;

//如果用户选择的是第一项“一天”,则exp_time的值为1

case "oneday": exp_time = 1; break;

//如果用户选择的是第一项“一周”,则exp_time的值为7

case "oneweek": exp_time = 7; break;

//如果用户选择的是第一项“一个月”,则exp_time的值为30

case "onemonth": exp_time = 30; break;

//默认情况,如果都没有选,则exp_time的值为0

default: exp_time = 0; break;

}

//myCookie这个集合填加一个名为“auth”,值为“admin”的 Cookie

myCookie.Values.Add("auth", "admin");

/*---------------------------------------------------------------------------------------------------------------------

如果“exp_time”的值“不为零”,则myCookie的生存期为从现在到增加的天数。注意:DataTime.Now方法可以返回当前时间,AddDays方法可以增加相应天数实际应用中你还可以使用其他方法使Cookie生存期精确到分和秒

--------------------------------------------------------------------------------------------------------------------*/

if(exp_time!=0){

myCookie.Expires = DateTime.Now.AddDays(exp_time);

}

/*--------------------------------------------------------------------------------------------------------------------

Response类的Cookies对象集合增加一个新的成员myCookie,注意:只有有这句代码,以上的Cookie设定才有效。

--------------------------------------------------------------------------------------------------------------------*/

Response.Cookies.Add(myCookie);

/*-------------------------------------------------------------------------------------------------------------------

设定Cookie之后,我们将刷新页面,为了使页面不读缓存,可以在本页URL

后面加一个GET参数,它是0-9999中任意一个整数

--------------------------------------------------------------------------------------------------------------------*/

Response.Redirect("Cookie.aspx?rand=" + r.Next(10000));

}

}

}

/*------------------------------------------------------------------------------------------------------------------

这个代码块是为“退出登录”这个文本按钮增加动作。注意:这个代码块是一个事件触发事件,你必须在.aspx页面的相应位置定义它。例如,返回到Cookie.aspx,把myLB组件的标签修改为:

<asp:LinkButton ID="myLB" runat="server" OnClick="myLB_Click">退出系统</asp:LinkButton>;还有一种更简单的“自动生成”办法:只要你回到Cookie.aspx的“设计”状态,双击myLB组件就可以看自动添加并转到本代码块,你只需要在代码块中填加以下代码:

--------------------------------------------------------------------------------------------------------------------*/

protected void myLB_Click(object sender, EventArgs e)

{

/*--------------------------------------------------------------------------------------------------------------

声明myCookie为名为auth的Cookie,且此Cookie的生存期为现在(立刻过期),清除Cookie之后,页面被重定向至本页,URL带有一个在0-9999的随机数

---------------------------------------------------------------------------------------------------------------*/

HttpCookie myCookie = new HttpCookie("auth");

myCookie.Expires = DateTime.Now;

Response.Cookies.Add(myCookie);

Response.Redirect("Cookie.aspx?del=true&rand=" + r.Next(10000));

}

}

10.3.4 编写Cookie.aspx页面文件

在“解决方案资源管理器”中双击Cookie.aspx,写入代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile=

"Cookie.aspx.cs" Inherits="Cookie" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>Cookie测试</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:Panel ID="myPanel" runat="server" Height="89px"

Width="260px">

用户名:<asp:TextBox ID="myUID" runat="server">

</asp:TextBox>&nbsp;<br />

密 &nbsp; 码:<asp:TextBox ID="myPWD" runat="server" TextMode=

"Password"></asp:TextBox>&nbsp;<br/>

<asp:DropDownList ID="myDDL" runat="server">

<asp:ListItem Selected="True" Value="no">不保存</asp:ListItem>

<asp:ListItem Value="oneday">一天</asp:ListItem>

<asp:ListItem Value="oneweek">一周</asp:ListItem>

<asp:ListItem Value="onemonth">一个月</asp:ListItem>

</asp:DropDownList><br/>

<asp:Button ID="myBTN" runat="server" Text="submit" />

</asp:Panel>

<asp:LinkButton ID="myLB" runat="server" OnClick=

"myLB_Click">退出系统</asp:LinkButton></div>

</form>

</body>

</html>

执行效果如图10.42所示:

图10.42

当输入正确的用户名和密码之后转向的随机页面如图10.43所示:

图10.43

* 注:这个示例的源文件在附带光盘下 第十章\3\cookie.aspx和cookie.aspx.cs

注意:只要你没有清空Cookies,此Cookie在其整个生存期都有效,你不妨重新打开浏览器试试效果。Cookie给我们带来很大方便,例如:在制作Flash留言本时,如果某些留言是只有高级会员才能观看的,我们就可以用ASP.NET检测客户端Cookie,如果存在并且满足观看权限,则生成其完整信息的XML信息,反之则生成受限制的XML信息。

10.3.5 ASP.NET中的Session

说完了Cookie,我们再来说说Session。它和Cookie类似,都可以用变量值表示浏览者的身份,不同的是:Cookie存于客户端,而Session变量存于服务器。未经授权,你可以修改甚至伪造一个Cookie,但你不能修改Session,在安全性方面,Session明显更胜一筹,但如果浏览者较多,Session保存时间较长,势必会给服务器造成较大的负担。所以,现在流行的办法是涉及到“管理”时采用“Cookie+Session双验证”,而普通会员只采取“Cookie单验证”,这样会使安全性和服务器负载达到较好的平衡。

在使用Session对象之前,我们有必要对ASP.NET中的Session有一个概念性的了解:

由于Session被保存在服务器上,不需要对客户端执行什么操作。所以Session的使用方法较Cookie要容易的多,常用的Session操作如下表所示:

对象名:

Session

赋予Session:

Session["键名"]=键值;

取得Session:

Session["键名"]

销毁Session:

Session.Abandon();

10.3.6 在ASP.NET中练习使用Session

我们还是在示例中学习ASP.NET中Session的用法。在Visual Studio 2005“解决方案资源管理器”下的地球图标上点右键→“添加一个新项目”,命名为Session.aspx,稍等片刻即可在“解决方案资源管理器”看到页面文件和逻辑文件。

在Session.aspx的设计界面,从工具箱里拖入工作区一个Panel组件、两个TextBox组件、一个Button组件和一个LinkButton组件。命名方式和上一例子相同:分别为myPanel、myUID、myPWD、myBTN和myLB。由于Session默认生存期为20分钟,所以我们并不需要上例的DropDownList下拉菜单。摆放顺序与上例类似,如图10.44所示:

图10.44

双击myLB文本按钮,Visual Studio 2005软件将自动转到其逻辑文件中,并且为此按钮增加了一个逻辑代码块。代码如图10.45所示:

图10.45

双击时,页面代码Session.aspx关于myLB标签也自动增加了一个触发代码:

<asp:LinkButton ID="myLB" runat="server" OnClick="myLB_Click">退出管理</asp:LinkButton>

10.3.7 逻辑代码的编写

在“解决方案资源管理器”中点选Session.aspx下面处于折叠状态的Session.aspx.cs,在其中输入如下代码:

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

public partial class _Session : System.Web.UI.Page

{

//下面代码声明了用于接收用户名,密码,随机数的变量

private string uid;

private string pwd;

Random r = new Random();

protected void Page_Load(object sender, EventArgs e)

{

//页面初始化时,“退出登录”这个连接是不可见的

myLB.Visible=false;

//如果本页不是被POST提交而访问的

if(!IsPostBack){

//如果Sesson对象集中auth子集的值为admin

if(Session["auth"]=="admin"){

//返回登录信息

Response.Write("你已登录管理状态");

//登陆群组不可见

myPanel.Visible=false;

//一旦登录,“退出登录”这个按钮就可见

myLB.Visible=true;

//如果密码错误,则重新进行登录循环

}else{

myPanel.Visible=true;

}

}else{

//用uid和pwd这两个变量接收文本输入框的值

uid = Request.Form["myUID"];

pwd = Request.Form["myPWD"];

//如果满足用户名和密码值

if (uid == "lau" && pwd == "abcdefg")

{

//赋予Session

Session["auth"] = "admin";

//返回随机页面

Response.Redirect("Session.aspx?rand=" + r.Next(10000));

}

}

}

//这是刚才双击myLB组件生成的代码块

protected void myLB_Click(object sender, EventArgs e)

{

//销毁Session

Session["auth"] = null;

Session.Abandon();

//跳转到随机页面

Response.Redirect("Session.aspx?rand="+r.Next(100));

}

}

10.3.8 编写Session页面文件

逻辑代码文件编写完成之后,我们来编写页面文件Session.aspx,在“解决方案资源管理器”中双击Session.aspx,在其中输入代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Session.aspx.cs" Inherits="_Session" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>Session测试</title>

</head>

<body>

<form id="form1" runat="server">

<div>&nbsp;

<asp:Panel ID="myPanel" runat="server" Height="89px"

Width="260px">

用户名:<asp:TextBox ID="myUID" runat="server">

</asp:TextBox>&nbsp;<br />

密 &nbsp; 码:<asp:TextBox ID="myPWD" runat="server"

TextMode="Password"></asp:TextBox>&nbsp;<br />

<br/>

<asp:Button ID="myBTN" runat="server" Text="submit"/>

</asp:Panel>

<asp:LinkButton ID="myLB" runat="server" OnClick="myLB_Click">退出管理</asp:LinkButton></div>

</form>

</body>

</html>

调试效果如图10.46所示:

图10.46

输入正确的密码之后,效果如图10.47所示:

图10.47

* 注:这个示例的源文件在附带光盘 第十章\4\session.aspx和session.aspx.cs

关闭浏览器或20分钟后不执行操作,Session将过期。

通过本节学习,我们对ASP.NET中的Cookie和Session使用有了一个概括性了解。建议读者自己多多尝试。

两个简单的Demo示例向读者展示Flash和ASP.NET交互原理以及过程相关推荐

  1. spring boot 一个极简单的 demo 示例

    1. 描述 一个spring boot 的简单demo示例. 环境: IDE(idea):2021.3 JDK:1.8 maven:3.8.4 spring boot:2.5.6 2. 结果 接口返回 ...

  2. 两种方案的demo示例

    假设散列长为8,散列函数H(K)=K mod 7,给定的关键字序列为{32,14,23,2, 20} 当使用链表法时,相应的数据结构如下图所示: 当使用线性探测法时,相应的数据结果如下图所示: 这里的 ...

  3. php简单的购物车,利用PHP实现一个简单购物车的demo示例代码

    利用PHP实现一个简单购物车的demo示例代码 数据结构跟关于PHP写购物车大体差不多,这里站长主要就购物车的主要业务逻辑进行一下说明: 1.用户未登陆时只能浏览商品,不能将其加入购物车 2.当未登陆 ...

  4. Levmar:VS2015编译Levmar及Demo示例

    参考 64位 WIN 7/8 下VS2010配置CLAPCAK3.2.1和Levmar2.6 准备 下载CMake:https://cmake.org/ 下载clapack_cmake:http:// ...

  5. 一个人做饭简单食谱_如何通过两个简单的寿司布局食谱来理解CSS浮动

    一个人做饭简单食谱 by Anabella Spinelli 通过安娜贝拉·斯皮内利(Anabella Spinelli) 如何通过两个简单的寿司布局食谱来理解CSS浮动 (How to unders ...

  6. 【分享】Vue 资源典藏(UI组件、开发框架、服务端、辅助工具、应用实例、Demo示例)...

    Vue 资源典藏,包括:UI组件 开发框架 服务端 辅助工具 应用实例 Demo示例 element ★11612 - 饿了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于Vue和 ...

  7. Dubbo入门介绍---搭建一个最简单的Demo框架

    Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbo zookeeper 更多 个人分类: ...

  8. 1.8 简单卷积网络示例-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.7 单层卷积网络 回到目录 1.9 池化层 简单卷积网络示例 (A Simple Convolution Network Example) 上节课,我们讲了如何为卷积网络 ...

  9. Dubbo入门----搭建一个最简单的Demo框架

    Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...

最新文章

  1. Win7在IIS7中启用CGI
  2. HALCON基于形变的模板匹配实现
  3. IP与DSCP优先级
  4. Leetcode 210. 课程表 II 解题思路及C++实现
  5. randn--创建正态分布随机矩阵
  6. findContours函数
  7. HTML5 Web SQL
  8. C盘空间太小,建议删除如下文件以释放空间!
  9. php if多条件_通过PHP与Python代码对比浅析语法差异
  10. 21-nginx单机1W并发优化
  11. VUE+element-ui开发出的美观好看的登录注册模板组件 集成方便
  12. RTC月度小报5月 |教育aPaaS灵动课堂升级、抢先体验VUE版 Agora Web SDK、声网Agora与HTC达成合作
  13. 使用Java编写爬虫,下载百度图片
  14. bell-lapadula vs biba
  15. python立体图形_Python 立体图形的画法(一)
  16. 华为机试—手机号码验证
  17. 【转】用户管理模块:如何保证用户数据安全?
  18. 算法笔记——15个瓶子,4只老鼠,测试哪瓶有毒
  19. MIPI2LVDS芯片TC358774XBG寄存器查看与调试
  20. 最新整理英文论坛大全(有评论)

热门文章

  1. Java技术系列文章汇集(长期更新)
  2. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点(转)
  3. git 分支管理策略 与 物理实现 --author by阮一峰 小鱼
  4. tomcat开启cgi
  5. 如何创建自定义性能计数器
  6. 面试:对象的生命周期
  7. 面试官系统精讲Java源码及大厂真题 - 37 ThreadPoolExecutor 源码解析
  8. Antd Vue 组件库之Table表单
  9. Docker快速搭建Bugzilla
  10. 使用meterpreter让没有安装python解释器的肉鸡设备执行任意python程序