ASP.NET-AJAX笔记总结

1第一个ASP.NET程序  

概念:ASP.NET是建立在微软新一代.Net平台架构上,利用普通语言运行时(Common Language Runtime)在服务器后端为用户提供建立强大的企业级Web应用服务的编程框架。
优点:

与浏览器无关

方便设置端点、易于调试

编译后执行,运行效果提高

丰富的控件库
创建与项目文件同目录下的解决方案(适用于普通系统)
步骤:
文件——新建——项目——Visual Studio 解决方案(到此新建一个不包含项目的空解决方案)——在解决方案资源管理器中,选中新建的接解决方案——右键——
添加——新建网站——点击浏览,在打开的对话框中,选中刚才所建的空解决方案路径——在打开的对话框中选中,在现有的位置创建新网站——单击确定
创建与项目文件同目录下的解决方案(适用于构建三层结构的系统)

步骤:
文件——新建——项目——Visual Studio 解决方案(到此新建一个不包含项目的空解决方案)——在解决方案资源管理器中,选中新建的解决方案——
在解决方案路径后写入 /文件夹名——单击确定即可

弹框提示

种类

语法

新建空白页弹框

(1)Response.Write("<script>alert(/"用户名或密码错误!/");location.href='login.aspx';</script> ");
(2)Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "",
"<script>alert(/"
用户名或密码错误!/");location.href='login.aspx';</script> ");

在本页弹框(注册弹框)

(1)Page.ClientScript.RegisterStartupScript(this.GetType(), "",
"<script>alert(/"
用户名或密码错误!/");location.href='login.aspx';</script> ");
(2)
在页面上添加一个Label控件 this.Label控件ID.Text = "<script>alert('正确!');</script>";(实现代码)

    //对显示的内容做处理(后置代码中)
    public static string CutString(Object content, int num) {
        if (content.ToString().Length > num - 2)
        {
            return content.ToString().Substring(0, num - 2) + "...";
        }
        else {
            return content.ToString();
        }
    }

2系统对象与状态管理

Page对象
Page
对象是指向页面自身的方式,在整个页面的执行期内,都可以使用该对象
示例:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="defautl.aspx.cs" Inherits="_default" %>

属性

说明

Language

指定页面代码和后置代码使用的语言,需要注意的是,这里支持微软.NET框架中的语言

AutoEventWireup

设置页面是否自动调用网页事件(也就是在后置代码中的Page_Load() 事件是否执行),默认(不写时)为true

CodeFile

指定代码后置文件,后置代码,该后置代码与页面是局部关系

Inherits

页面类

Request对象
Request
对象封装了由Web浏览器或其他客户端生成的 HTTP 请求的细节(参数、属性和数据),提供从浏览器读取信息或这读取客户端信息等功能,用于页面请求期
Request
对象是HttpRequest类的一个实例。它能够读取客户端在Web请求期间发送的HTTP值。

Request对象属性

属性

说明

UserLanguages

客户端主机所使用的语言

UserHostName

客户端主机的DNS名称

userHostArrress

客户端主机的IP地址

UserAgent

客户端浏览器版本

Url

当前要求的URL

TotalBytes

当前输入的容量大小

ServerVariables

网页的Server变量,集合中包含了服务器和客户端的系统信息

RequestType

客户端网页的传送方式(Get/Post)

RawUrl

当前页面的URL

QueryString

浏览器地址栏后的参数

PhysicalPath

当前网页在服务器端的实际路径

PhysicalApplicationPath

当前在服务器端执行的程序的实际路径

Pathq

当前网页的相对地址

Params

返回QueryStringFormCookiesServerVariables的全部集合

IsSecureConnection

目前联机的安全性

IsAuthenticated

目前联机是否有效

HttpMethod

目前客户端网页的传送方式(Get/Post)

Headers

网页的标题集合

Form

窗体变量

Files

客户端上传的文件

FilePath

当前执行网页的相对地址     

Cookies

HttpCookieCollection对象集合

ContentType

当前需求的MIME内容类型

ContentEncoding

客户端浏览器的字符设置

ConnectionlD

客户端所提出的网页浏览请求的联机的ID  

ClientCertificate

客户端安全认证信息

Browser

客户端浏览器的信息(获取有关正在请求的客户端的浏览器功能的信息)

AnnlicationPath

当前运行程序的服务器端虚拟目录

Path

获取当前请求的虚拟路径

BinaryRead

执行对当前输入流进行指定字节数的二进制读取

MapPath

为当前请求将请求的 URL 中的虚拟路径映射到服务器上的物理路径

示例:
1
、使用QuestString获取 HTTP 查询字符串变量集合
页面1中有一连接地址进行参数传递:
    <a href = "QueryString.aspx?nameA='asp'&nameB='jsp'">
查看</a>   
页面2获得地址参数:
    //
首次加载
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if(Request.QueryString["nameA"] != null && Request.QueryString["nameB"] != null)
            {
                string nameA = Request.QueryString["nameA"] as string ;
                string nameB = Request.QueryString["nameB"] as string ;
            }
        }
    }

2
、使用Form获取 HTTP 查询字符串变量集合
页面1中有一连接地址进行参数传递:
    <form name="formGet" method="get" action = "Form.aspx?nameA='asp'&nameB='jsp'">
    </form>   
页面2获得地址参数:
    //
首次加载
    <Script Language="C#" Runat="Server">
        void Page_Load(object sender, System.EventArgs e)
        {
            Response.Write(Request.Form["nameA"] + "<br>" +Request.QueryString["nameB"]);
        }
    </Script>
Response
对象
Response
对象封装了返回到 HTTP 客户端的输出,提供向浏览器输出信息或者发送指令,用于页面执行期

Response对象的常用方法

Write(String str)

可以输出指定的文本内容

End()

可以使用 Web 服务器停止当前的程序并返回结果

Rediect(String URL)

可以将也页面重定向到另外一个页面

Page对象在后置页面中的属性

返回类型

语法

说明

示例

boolean

IsPostBack

获取一个值,该值指定该页是否正为响应客户端回发而加载,或者他是否正被首次加载或访问 (true 说明是响应客户端回发而加载 false 说明是首次加载或访问)

if (!IsPostBack) {
  this.txtName.Text = "
请在此输入用户名";
  this.txtPwd.Text = "
请在此输入密码";
}

boolean

IsCrossPagePostBack

获取一个值,该值指示跨页回发中是否涉及该页(判断页面是否是跨页提交)( true 说明是跨页提交 false 说明不是跨页提交)

if (Page.IsCrossPagePostBack) {
  this.txtKeyWord.Text = "
跨页数据传递";
}

PreviousPage 的属性和方法

返回类型

语法

说明

示例

boolean

IsCrossPagePostBack

获取一个值,该值指示跨页回发中是否涉及该页(判断页面是否是跨页提交)(true 说明是跨页提交 false 说明不是跨页提交)

if (PreviousPage.IsCrossPagePostBack)
{
  this.lblShow.Text = "
跨页数据传递";
}

Control

FindControl(String ID)

在页命名容器中搜索带指定标识符的服务器控件。

((TextBox)this.PreviousPage.FindControl("txtKeyWord")).Text;

ASP.NET页面传值

页内传值

//传递
protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    this.txtName.Text = "
请在此输入用户名";
    this.txtPwd.Text = "
请在此输入密码";
  }
}
//
接收数据
protected void btnSub_Click(object sender, EventArgs e)
{
  Response.Write(this.this.txtName.Text + <br/>; + this.txtPwd.Text);
}

跨页传值

//接收数据
protected void Page_Load(object sender, EventArgs e)
{
  if (Page.PreviousPage != null) {
    if (PreviousPage.IsCrossPagePostBack) {
      this.lblName.Text = "
名:" + ((TextBox)this.PreviousPage.FindControl("txtName")).Text;
    }
  }
}

页面跳转

重定向

Response.Redirect(String URL)

protected void btnSub_Click(object sender, EventArgs e)
{
  if (this.txtName.Text.Trim() == "" || this.txtPwd.Text.Trim() == "")
  {
    Response.Write("
请输入姓名或密码");
  }
  else
  {
    Response.Redirect("welcome.aspx");
  }
}

使用Button自带的属性

PostBackUrl单击按钮时所发送到的 URL

单击按钮页面跳转传参
    //
传参
    protected void btnSub_Click(object sender, EventArgs e)
    {
        Response.Write("<script>window.location.href='BookDetail.aspx?iSBN="+this.txtISBN.Text+"'</script>");
        //Response.Redirect("BookDetail.aspx?iSBN=" + this.txtISBN.Text);
    }
    //
接受
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString["iSBN"] != null)
        {
            iSBN = Request.QueryString["iSBN"].Trim();
            this.ShowBook(id, iSBN);
        }
    }
Cookie
对象
保持于客户端的共享信息方式

单个写入形式

Response.Cookies["Cookie 的名称"].Value=变量值; //写入 Cookie
Response.Cookies("Cookie
的名称").Expires= DateTime.Now.AddMonths(1); //设置 Cookie 时间(有效期为一个月)
string
变量名=Request.Cookies["Cookie 的名称"].Value; //读取 Cookie

使用数组类型形式

HttpCookie hcCookie = new HttpCookie("Cookie 的名称","");
hcCookie.Values["
子变量名称1"] = 变量值;
hcCookie.Values["
子变量名称2"] = 变量值;
hcCookie.Expires = DateTime.Now.AddMonths(1); //
有效期为一个月
Response.Cookies.Add(hcCookie);
string
变量名1 = Request.Cookies["Cookie 的名称"]["counts"]; //读取 Cookie



Session
对象
为某个用户提供共享信息,作用于用户会话期
语法
Session["Session
名称"] = ; //存储
变量 = Session["Session 名称"] as 对象名; //读取

Session对象的常用属性和方法

属性和方法

说明

SessionID 属性

包含唯一的的用户会话标识符,它可用于在整个会话过程中记录用户信息

Timeout 属性

用户设置用户超时的时间,单位为分钟。在该段时间内,用户即使没有任何操作,用户状态也不会被清除,注意此设置是针对服务器清除Session的时间而言,因为如果一段时间内没有操作,服务器是无法知道用户是否在线,所以一超时时间为限。而客户端有自己的处理机制,不同的浏览器也不尽相同,一般关闭窗口就会造成Session失效。(默认为20分钟)

IsNewSession 属性

如果已按当前请求创建会话,那么该属性将返回true

Clear 方法

从会话状态集合中移除所有的键和值

Abandon方法

结束Session,取消当前会话(当前页面所有代码都执行结束以后才会执行)

Application 对象
为所有用户提供共享信息,作用于整个应用程序运行期
语法
Application["Application
名称"] = ;
变量 = Application["Application 名称"]

Application 对象的常用属性

 

说明

属性

All

返回全部的 Application 对象变量到一个对象数组

AllKeys

返回全部的 Application 对象变量到一个字符串数组

Count

取消 Application 对象变量的数值

Item

允许使用索引或 Application 变量名称传回内容值

方法

Add

新增一个 Application 对象变量

 

 

Clear

清楚全部的 Application 对象变量

Get

使用索引值或变量名称传回变量值

Set

使用变量名称更新一个 Application 对象变量的内容

Lock

锁定全部的 Application 变量

UnLock

解除锁定 Application 变量

ViewState
Server
对象
该对对象是 JSP中没有的,它提供了服务期端的一些属性和方法。

Server对象的常用方法

HtmlEncode

此方法带有一个字符串参数,可以将其编码,使其在浏览器中正确显示。比如希望在页面输入一个"<br>",又不想在浏览器中显示成换行,则需要使用该方法

HtmlDecode

此方法与HtmlEncode方法相反,对以编码内容解码

MapPath

此方法带有一个虚拟路径,可返回该路径的物理磁盘中的准去位置。此方法在Web开发过程中使用频率比较高。一般实现文件读写都需要该方法

UrlEncode

URL地址进行编码。对于URL需要传输含有"#""&"等特殊自负的参数时,需要进行编码,否则后面的内容不会被识别

Execute

在当前页面执行参数指定的页面,执行完后继续执行本页面

Transfer

参数指定的页面处理完成后,页面执行就结束,不像Execute那样还要返回控制权给先前的页面

Application,Session,Cookie,ViewStateCache用法和区别

内置对象

信息量大小

作用域和保存时间

应用范围

保存位置

Application

任意大小

整个应用程序的生命期

整个应用程序/所有用户

服务器端

Cache

任意大小

可以根据需要设定

整个应用程序/所有用户

服务器端

Session

小量,简单的数据

用户活动时间+一段延迟时间(一般为20分钟)

单个用户

服务器端

Cookie

小量,简单的数据

可以根据需要设定

单个用户

客户端

Viewstate

小量,简单的数据

一个Web页面的生命期

单个用户

客户端

隐藏域

小量,简单的数据

一个Web页面的生命期

单个用户

客户端

查询字符串

小量,简单的数据

直到下次页面跳转请求

单个用户

客户端

      

1.Application对象
Application
用于保存所有用户的公共的数据信息,如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnStart事件(global.asax)中完成.尽管使用Application.LockApplicaiton.Unlock方法来避免写操作的同步,但是它串行化了对Application对象的请求,当网站访问量大的时候会产生严重的性能瓶颈.因此最好不要用此对象保存大的数据集合. 下面我们做个在线用户统计的例子来说明这个问题:
(
以文件的形式存放网站总访问量)
Code
Global.asax

using System;
using System.Collections;
using System.ComponentModel;
using System.Web;
using System.Web.SessionState;
using System.IO;
/// Global
的摘要说明。
public class Global : System.Web.HttpApplication
{///  
必需的设计器变量。
   private System.ComponentModel.IContainer components = null;
   private FileStream fileStream;
   private StreamReader reader;//
读字符流
   private StreamWriter writer;//
写字符流
   public Global()
   {
      InitializeComponent();
   }
   protected void Application_Start(Object sender, EventArgs e)
   {
      Application["CurrentGuests"]=0;//
初始花为0;
    fileStream = File.Open(Server.MapPath("counts.text"),FileMode.OpenOrCreate);//
文件不存在,创建文件
      reader = new StreamReader(fileStream);//
要读取的完整路径
      Application["AllGuests"] = Convert.ToInt32(reader.ReadLine()); //
从当前流中读取一行字符并将数据作为字符串返回
      reader.Close();//
关闭流
   }
 protected void Session_Start(Object sender, EventArgs e)//
当用户访问网站时,在线用户+1,总访问数+
   {
      Application.Lock();//
同步,避免同时写入
      Application["CurrentGuests"] =(int)Application["CurrentGuests"]+ 1;//
总在线用户数
      Application["AllGuests"] =(int)Application["AllGuests"]+ 1;//
访问网站的总用户数
     fileStream=new FileStream(Server.MapPath("counts.text"),FileMode.OpenOrCreate,FileAccess.ReadWrite);//
      writer = new StreamWriter(fileStream);//
实现一个写入流,使其以一种特定的编码向流中写入字符
      writer.WriteLine(Application["AllGuests"].ToString());//
把访问网站的总用户数再次写入到文件
      writer.Close();//
关闭写入流
      Application.UnLock();//
同步结束
   }
   protected void Session_End(Object sender, EventArgs e)//
当前用户退出网站时,在线用户数量-1,
   {
      Application.Lock();
      Application["CurrentGuests"] =(int)Application["CurrentGuests"] - 1;//
总在线用户数量-1
      Application.UnLock();
   }
}
(2) WebForm1.aspx
private void Page_Load(object sender, System.EventArgs e)
{
   this.Label1.Text = "
正在访问站点的用户数:" + Application["CurrentGuests"].ToString();
   this.Label2.Text ="
访问过站点的总用户数:" + Application["AllGuests"].ToString();
}
2.Session
对象
Session
用于保存每个用户的专用信息.每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话IDSession ID) . 她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session中的信息保存在Web服务器内容中,保存的数据量可大可小.Session超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低.对于小量的数据,使用Session对象保存还是一个不错的选择.使用Session对象保存信息的代码如下:
//
存放信息
Session["key"]="value"
//
读取数据
string UserName=Session["key"].ToString();
3.Cookie
对象
Cookie
用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它存放非敏感性的用户信息,信息保存的时间可以根据需要设置.如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过期.Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K,因此不要用来保存数据集及其他大量数据.由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性.使用Cookie对象保存的代码如下:
//
存放信息
Response.Cookies["key"].Value="value";
//
读取信息
string UserID=Response.Cookies["key"].Value;
4.ViewState
对象
ViewState
常用于保存单个用户的状态信息,有效期等于页面的生存期。跟隐藏控件相似。viewstate是在本页面之内各函数间进行传值的 , 至于为什么要使用这种方法是因为在一个事件发生之后 , 页面可能会刷新 , 如果定义全局变量会被清零 , 所以要使用 viewstate. ViewState容器可以保持大量的数据,但是必须谨慎使用,因为过多使用会影响应用程序的性能。所有Web服务器控件都使用ViewState在页面回发期音保存自己的状态信息。如果某个控件不需要在回发期间保存状态信息,最好关闭该对象的ViewState,避免不必要的资源浪费。通过给@Page指令添加“EnableViewState=false”属性可以禁止整个页面的ViewState。使用ViewState对象保存信息的代码如下。
//
存放信息
ViewState["key"]="value";
//
读取信息
string NameID=ViewState["nameID"].ToString();

5.Cache
对象
Cache
对象用于在HTTP请求间保存页面或数据。该对象的使用可以极大地提高整个应用程序的效率。常用于将频繁访问的大量服务器资源存储在内存中,当用户发出相同的请求后服务器不再次处理而是将Cache中保存的信息返回给用户,节省了服务器处理请求的时间。其生存期依赖于该应用程序的生存期。当重新启动应用程序时,将重新创建其Cache对象的实例。使用Cache对象保存信息的代码如下。
//
存放信息
Cache["nameID"]="0001";
//
存放信息
Cache.Insert("nameID","0001"1);
//
读取信息
string NameID=Cache["nameID"].ToString();
6.
隐藏域
Hidden
控件是属于HTML类型的服务器控件,使用此控件可以实现隐藏域的功能。其实此控件和其它服务器控件的使用没有太大区别,只是它不会在用户端的浏览器中显示,始终处于隐藏状态。但是每次页面提交的时候,此控件和其它服务器控件一同提交到服务器端,因此在服务器端可以使用Value属性获取或保存一些数据信息。使用Hidden控件保存信息的代码如下。
//
存放信息
Hidden.Value="0001";
//
获取信息
string NameID=Hidden.Value;
7.
查询字符串
查询字符串的方式是将要传递的值连接在URL后面,然后通过Response.Redirect方法实现客户端的重定向。这种方式可以实现在两个页面之间传递信息。由于URL的长度有一定的限制,因此不能传递太大的信息,加外安全性也不是很好。
//
传递信息如下。(问号后面格式 key1=value1&key2=value2)
Response.Redirect("List.aspx?nameID=0001&gradeID=002");
//
执行上面的语句后在IE地址栏显示的URL的代码如下。
http://localhost/List.aspx?nameID=0001&grade=002
//
当跳转到List.aspx后,可以通过以下代码获得所传递的信息。
string NameID.GradeID;
NameID=Request.Params["nameID"];
GradeID=Request.Params["gradeID"];

3用站点导航控件与母版页搭建页面框架

Lable控件

属性

说明

ID

控件的唯一标识,所有服务器都有

Text

显示文本(如果在此控件里加入HTML标签,服务器会解析)

Visible

布尔类型,设置控件是否可见。默认为true(呈现)。这是所有服务器控件共有的属性

ForeColor

设置前景色,这是所有服务器控件共有的属性,Lable中就识所有显示文字的颜色

Button控件常用属性和事件

属性或事件

说明

Text属性

按钮上显示的文字,虽然不是所有服务器共有的特征,但该属性的出现还是比较频繁的

PostBackUrl属性

这是按钮的特性,按钮可以将页面提交到另外一个页面,由该属性确定

CausesValidation属性

是否导致激发验证

Click事件

控件被单击并且CommandName未复制时激发该事件,它是按钮最常用的事件

TextBox 控件常用属性和事件

属性或事件

说明

AutoPostBack属性

布尔值,指定是否自动回发到服务器。默认为false

AutoCompleteType属性

自动完成类型,比如设置该类型为 E-mail,则显示浏览器中记录的自动完成的E-mail地址

TextMode属性

枚举类型,SingleLine为默认值,显示一行文字;Password内容显示为星号;MulitiLine是显示多行文本内容

Text属性

设置或者获取控件的文本内容

ReadOnly属性

指示该控件内容是否可编辑,默认为false

Wrap属性

布尔值,指示多行文本中的文本是否可以换行,默认为true;如果设置为false,则会显示一个水平滚动条

TextChang事件

当文本发生变化且失去焦点时触发的事件。注意该事件需要配合 AutoPostBack使用,因为只有自动回发到服务器,文本改变的事件才会执行

     

SiteMapPath控件(面包屑导航)
步骤:
1
、添加SiteMapPath控件(导航)
2
、新建站点地图
3
、编写站点地图
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="" title=""  description="">
        <siteMapNode url="" title=""  description="" />
        <siteMapNode url="" title=""  description="" />
    </siteMapNode>
</siteMap>

节点描述

sitMap

根节点,一个站点地图只能有一个siteMap元素。

sitMapNode

对应于页面的节点,一个节点描述一个页面。

title

描述页面(这个页面头部的<title>标记没有任何联系,虽然他们的值可以相同)

url

文件在解决方案中的位置。

description

说明性文本

编写注意事项:
站点地图根节点为<siteMap>元素,每个文件有且仅有一个根节点。
<siteMap>
下一级有且仅有一个<siteMapNode>节点。
<siteMapNode>
下面可以包含多个新的<siteMapNode>节点。
在站点地图中,同一个URL仅能出现一次。
4
、根据站点地图创建其他页面
注意:站点地图中必须有当前页的URL,否则该站点导航控件将不会显示。

SiteMapPath控件常用属性

属性

说明

pathSeparator

控制分隔符。可以通过编辑模板更改分隔符为任意样式,比如为图片

parentLevelsDisplayed

要显示的父节点的级数,用于控制导航显示的级数,如果导航过深,可能影响美观,则需要通过该属性控制级数,默认情况下,该值为-1,表示无限制。

TreeView导航控件
步骤
1
、添加TreeView控件(导航)
2
、绑定方式

绑定站点地图

1、新建站点地图
2
、编写站点地图
3
、开始绑定:在TreeView任务的选择数据源下拉框中选择新建数据源——在数据源配置向导的选择数据源类型中选择站点地图——单击确定

绑定XML

1、新建XML文件
2
、编写XML文件
3
、开始绑定:在TreeView任务的选择数据源下拉框中选择新建数据源——在数据源配置向导的选择数据源类型中选择XML文件——单击确定——在配置数据源的数据文件——单击浏览——选定所要绑定XML文件——单击确定——单击确定
4
、编数据绑定:在TreeView任务的编辑TreeNode数据绑定——在可用数据绑定框中选择节点——单击添加——修改数据绑定属性的TexField——选择要显示的元素——单击确定

3、设置格式:在TreeView任务的选择自动套用格式——在自动套用格式对话框中选择需要的样式——单击确定

TreeView数据绑定的常用属性

TexField

设置显示文字所绑定的字段或元素

NavigateUrlField

设置链接对应的字段或元素值

母版页
概念:是以“.master”作为后缀名的文件,它可以将页面上的公共元素整合在一起
优点:
1
、有利于站点修改和维护,降低开发人员的工作强度。
2
、提供高效的内容整合能力。
3
、有利于实现页面布局。
4
、提供一种便于利用的对象模型。

普通页面与母版页面的区别

方面

普通页面

母版页面

声明

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

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="..." Inherite="..." %>

扩展名

普通页面是.aspx

母版页面是.master

ContentPlaceHolder控件

普通页不可以使用此控件

母版页可以有一个或多个ContentPlaceHolder控件(标准)

将静态页面转换成母版页
1
、新建母版页
2
、将静态页面<head>标签里的文本复制到母版页的<head>标签里
3
、将静态页面<body>标签里的文本复制到母版页的<body>标签里
4
、在母版页中添加ContentPlaceHolder控件区
应用母版页

创建内容页

方法1、在新建Web 窗体时将右下角的选择母版页框勾上——单击添加——在弹出的选择母板页对话框中的项目文件夹中选择母版页——单击确定然后将静态页面复制到<asp:Content></asp:Content>——最后删除<html><head><link><meta><body><form> 方法2、在母版页上右键单击——选择添加内容页——然后就可以在ContentPlaceHolder控件区添加内容

将现有页改为内容页

@Page 标记指定 MasterPageFile 位置——去除内容页的多余 html 标签——去除form标记——创建<asp:Content>标签,并放入对应的内容——指定相应的ContentPlaceHolderID

内容页代码含义

代码

含义

MasterPageFile

用于指定所使用的母版页的路径

Title

用于设置内容页显示的标题

ContentPlaceHolderID

用于控制该Content控件在页面中的位置,即指定所对应的母版页中ContentPlaceHoder控件的ID,如果指定的ID在母版页中步存在,将会发生错误

     

5数据查询与展示GridView

GridView连接数据源
编码指定数据源
this.GridView1.DataSource =
返回值为集合的方法;
this.GridView1.DataBind();
以下为使用数据源控件

数据源控件

控件名

说明

SqlDataSource

用来从SQL ServerODBCOracle等数据源中检索数据。通过连接字符串指定。

AccessDataSource

继承自SqlDataSource,专门用于从Access数据库中检索数据

ObjectDataSource

能够将来自业务逻辑层的数据对象与表示层中的数据绑定控件绑定,实现数据的显示、编辑等任务

XmlDataSource

用于检索和处理XML等分层数据。它可以从文件、URL或者也包含XML内容的字符串中加载XML数据

SiteMapDataSource

专门处理类似站点地图的XML数据。默认情况下,数据源好似以.sitemap为扩展名的XML文件

常见数据绑定控件

控件名称

说明

GridView

通过表格方式实现数据的展示,并集成编辑、分页、排序等功能。

DetailsView

显示单条记录的详细信息,并支持对记录的添加、删除、修改等。

DropDownList

下拉菜单控件

数据绑定控件绑定数据源语法
数据绑定控件ID.DataSourceID = 数据源控件ID;
绑定字段

BoundField

用于显示普通文本,是默认的数据绑定列的类型,一般自动生成的列就是该类型

GridView查询所有信息
步骤
1
、添加GridView控件(数据)——配置好显示列
2
、在GridView 任务选择数据源下拉框中选择新建数据源——在数据源配置向导的选择数据源类型中选择对象——单击确定
3
、在选择业务对象下拉框中选择需要的业务逻辑层方法——单击下一步——在定义数据方法中选择SELECT——在选择方法下拉框中选择
所需要的方法
GridView
中添加新列(添加外键列)
步骤
1
、在GridView 任务——单击添加新列——在添加字段的选择字段类型下拉框中选择TemplateField——并添加页眉文本——单击确定
2
、在GridView 任务——单击编辑模板——GridView 任务模板编辑模式的显示下拉框中选择刚才添加的新列——ItemTemplate中添
加一个Lable控件——Lable任务中——单击编辑DataBindings——Lable DateBindings对话框中为Text绑定数据——首先选中字段
绑定——在字段绑定下拉框中选择需要的字段——然后在选择自定义绑定进行代码表达式修改对要显示的外键字段对象进行修改来显示
相应的属性——单击确定——GridView 任务——单击结束模板编辑
DropDownList
控件绑定数据源连接GridView控件根据条件显示
步骤
1
、添加DropDownList控件(标准)——DropDownList任务——单击选择数据源——在选择数据源下拉框中选择新建数据源——在数据
源配置向导的选择数据源类型中选择对象——单击确定
2
、在选择业务对象下拉框中选择需要的业务逻辑层方法——单击下一步——在定义数据方法中选择SELECT——在选择方法下拉框中选择
所需要的方法
3
、在 选择要 DropDownList 中显示的数据字段下拉框中选择所需的字段
4
、在 DropDownList 的值选择数据字段下拉框中选择所需的字段(一般选择ID字段)
5
、将DropDownList控件AutoPostBalck改为true
6
、添加GridView控件(数据)——配置好显示列
7
、在GridView 任务选择数据源下拉框中选择新建数据源——在数据源配置向导的选择数据源类型中选择对象——单击确定
8
、在选择业务对象下拉框中选择需要的业务逻辑层方法——单击下一步——在定义数据方法中选择SELECT——在选择方法下拉框中选择
所需要的代参方法——单击下一步
9
、在定义参数对话框中的参数源下拉框中选择Control——ControlID下拉框中选择DropDownList控件名——DefaultValue文本框中
可以给定DropDownList控件所选中的默认值(也可以不写)——单击完成
在后置代码中获得选中的值DropDownList.SelectedValue.ToString();
DropDownList
的常用属性和事件

属性或事件

说明

SelectedItem 属性

设置获取下拉菜单的选中项,该属性的类型为System.Web.UI.WebControls.ListItem,所有列表控件(ListControl)中的项都是该类型。他常用的两个属性是TextValueValue用于设置获取项的值;Text用于设置获取显示文本

SelectValue 属性

获取选择项的值,与SelectedItem.Value一致

DataTextField 属性

获取或设置提供列表项文本内容的数据源的字段

DataValueField 属性

获取设置提供列表项值内容的数据源的字段

AutoPostBack 属性

当选中一个列表项时,DropDownList 控件状态是否回发到服务器。默认情况下时false

SelectIndexChanged 事件

当列表控件选定的内容改变并发回服务器时发生。该事件仅当 AutoPostBack 属性设置为true是有效

       

    //手动绑定DropDownList
    this.ddlType.DataSource = RoomTypeManager.GetAllRoomTypes();
    this.ddlType.DataTextField = "TypeName";
    this.ddlType.DataValueField = "TypeId";
    ddlType.DataBind();
    //
DropDownList添加第一项
    ListItem list = new ListItem();
    list.Text = "--
选择--";
    list.Value = "0";
    ddlType.Items.Insert(0, list);
GridView
删除
步骤
1
、先查询所有信息并显示在GridView
2
、在 ObjectDataSource 任务——单击配置数据源——单击下一步——在定义数据方法中选择DELETE(不用设置ID因为ID是由DataKeyNames设置的)——在选择方法下拉框中选择
所需要的代参方法——单击完成
3
、在 GridView 属性中——DataKeyNames属性——单击——在数据字段集合编辑器中——在可用数据字段——选择ID——单击确定
4
、在GridView 任务——将启用删除勾上
5
、加删除页眉——GridView 任务——单击编辑列——在选定字段中选定删除——在属性窗口中修改HeaderText属性——单击确定
GridView
实现全选
步骤
1
、在GridView 任务——选择添加新列——在添加字段的选择字段类型下拉框中选择TemplateField——并添加页眉文本——单击确定
2
、在GridView 任务——单击编辑模板——GridView 任务模板编辑模式的显示下拉框中选择刚才添加的新列——HeaderTemplate
添加一个HTML中的CheckBox并添加相应的文字描述——ItemTemplate中添加标准中的CheckBox——GridView 任务——单击结束模板编辑
3
、在aspx源码中编写JavaScript脚本,如下:
<script type="text/javascript" language="javascript">
function GetAllCheckBox(CheckAll)

    var items = document.getElementsByTagName("input");
    for(var i=0;i<items.length;i++)
    {
        if(items[i].type == "checkbox")
        {
        items[i].checked = CheckAll.checked;
        }
    }
}
</script>
4
、调用方法
<asp:TemplateField HeaderText="
全选">
    <HeaderTemplate>
        <input id="cbAll" type="checkbox" οnclick="GetAllCheckBox(this)"/>
全选
    </HeaderTemplate>
    <ItemTemplate>
        <asp:CheckBox ID="chkSelect" runat="server" />
    </ItemTemplate>
</asp:TemplateField>
5
、在后置代码中获得多选项的ID
for (int i = 0; i < this.GridView1.Rows.Count; i++) //this.GridView1.Rows.Count
获得本页GridView控件上所有行数
{
    //
获得GridView每一行中的控件名为checkselect的控件,也就是说获得的是GridView每一行中的CheckBox控件
    CheckBox cb = (GridView1.Rows[i].FindControl("checkselect")) as CheckBox;
    if (cb.Checked == true) //
判断是否选中
    {
        //
获得选中行的第一列值(一般将第一列绑定为ID列),这样就可以根据此处的Id进行删改了
        Convert.ToInt32(GridView1.Rows[i].Cells[0].Text.ToString());
    }
}
实现光棒
   
执行的事件是GridViewRowDataBound事件
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes.Add("onmouseover", "currentcolor=this.style.backgroundColor;this.style.backgroundColor='#6699ff'");
            e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=currentcolor");
        }
    }   
//
根据修改、删除做处理(后置代码中)
    protected void GVRoomTypes_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        string cmd = e.CommandName;
        int typeId = Convert.ToInt32(e.CommandArgument);
        if (cmd == "De") //
删除
        {
            RoomTypeManager.DeleteRoomTypeByTypeId(typeId);
        }
        else if (cmd == "Ed") //
修改
        {
            Page.Server.Transfer("EditRoomType.aspx?typeId=" + typeId);
        }
    }
GridView
详细显示
步骤
1
、在GridView 任务——选择添加新列——在添加字段的选择字段类型下拉框中选择TemplateField——并添加页眉文本——单击确定
2
、在GridView 任务——单击编辑模板——GridView 任务模板编辑模式的显示下拉框中选择刚才添加的新列——ItemTemplate中添加标准中的LinkButton——修改其ID属性、Text属性并设置它的CommandArgument属性(与此按钮相关联的命令参数)CommandName属性(与此按钮相关的命令)
源码修改
<asp:TemplateField HeaderText="
详细">
    <ItemTemplate>
<asp:LinkButton ID="lkbParticular" runat="server" CommandArgument='<%# Eval("Id") %>' CommandName="xiang">
详细
    </ItemTemplate>
</asp:TemplateField>
3
、在后置代码中编写下列事件(行按钮触发事件)
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName.Equals("
参数")) //判断事件触发行中那个控件(有CommandName属性设置)
        {
            int id = Convert.ToInt32(e.CommandArgument); //
获得事件触发行的ID
            Response.Redirect("#.aspx?id=" + id); //
重定向到其他页面
        }
    }
4
、添加DetailsView控件——DetailsView 任务——在选择数据源中选择新建数据源——在数据源配置向导的选择数据源类型中选择
对象——单击确定
5
、在选择业务对象下拉框中选择需要的业务逻辑层方法——单击下一步——在定义数据方法中选择SELECT——在选择方法下拉框中选择
所需要的代参方法——单击下一步
6
、在定义参数对话框中的参数源下拉框中选择QueryString——QueryStringField文本框中添加所要获得参数(一般获得id——
DefaultValue
文本框中可以给定默认值(也可以不写)——单击完成
7
、美化显示——DetailsView 任务——单击编辑字段——对字段进行编辑——单击确定

DetailsView 控件的常用属性和事件

属性或事件

说明

DefaultMode 属性

设置获取控件默认的状态(模式)。该属性为枚举值,分为 ReadOnly(显示)、Edit(修改)和Insert(添加)

DataKey 属性

数据主键

DataKeyNames 属性

设置获取一个字符串,该字符串包含数据源中间的组合

ItemInserting 事件

单击添加按钮,执行添加方法之前执行

ItemInserted 事件

单击添加按钮,执行添加方法之后执行

ItemUpdating 事件

单击更新按钮,执行更新方法之前执行

ItemUpdated 事件

单击更新按钮,执行更新方法之后执行

数据绑定的写法EvalBind的对比

Eval()

Bind()

Eval是指读的,可实现格式化显示

Bind支持读/写功能,可将跟新后的数据提交回服务器。一般与TextBox等控件使用

GredView设置方法
1
、存储:在GridViewDataKeyNames属性设置ID
获得:在GridViewRowDataBound事件里 int ID = this.GridView1.DataKeys[e.Row.RowIndex].Value;
2
、存储:在模板列的项目模板中添加控件设置控件的CommandArgument='<%# Eval("Id") %>'属性
获得:在GridViewRowCommand事件里int id = Convert.ToInt32(e.CommandArgument);

6数据插入与更新

验证控件
1
RequiredFieldValidator
功能:确保用户提供有效的输入,即提供非空验证。

属性

说明

ControToValidate

要验证的控件的ID,所有验证控件都有该属性

Text

出错时的提示,使所有验证控件共有的属性

ErrorMessage

提交给汇总的错误信息。另外,如果Text属性为空,则出错时将显示该信息,是所有验证控件共有的属性(只有Text显示完才会显示)

示例:
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvName" runat="server" ControToValidate="txtName" ErrorMessage="
请输入用户名"></asp:RequiredFieldValidator>
2
CompareValidator
功能:用于验证用户输入的内容是否符合要求

CompareValidator控件的常用属性

属性

说明

ControToValidate

要验证的控件的ID,所有验证控件都有该属性

ControlToCompare

用来与要验证的控件进行比较的控件的ID

Type

设置比较类型(比如字符串、整形等),不同类型的比较可能会出错

Operator

设置比较运算符,比如等于、大雨等于、小于等于、大于、小于。默认设置为等于Equal

ValueToCompare

用于比较的值

Text

出错时的提示,使所有验证控件共有的属性

ErrorMessage

提交给汇总的错误信息。另外,如果Text属性为空,则出错时将显示该信息,是所有验证控件共有的属性(只有Text显示完才会显示)

示例:
<asp:TextBox ID="txtPassWord" runat="server" TextMode="PassWord" ></asp:TextBox>
<asp:TextBox ID="txtPassTwo" runat="server" TextMode="PassWord" ></asp:TextBox>
<asp:CompareValidator ID="cvPass" runat="server" ControlToCompare="txtPassWord" ControlToValidate="txtPassTwo" ErrorMessage="
两次密码输入要一致"></asp:CompareValidator>
3
RangeValidator
功能:用于范围检查

RangeValidator控件的常用属性

属性

说明

ControToValidate

要验证的控件的ID,所有验证控件都有该属性

MaximumValue

范围的上界(最大值)

MinimumValue

范围的下界(最小值)

Type

验证类型(字符串、整形、双精度、日期、货币五种),不同类型之间比较可能引发问题

Text

出错时的提示,使所有验证控件共有的属性

ErrorMessage

提交给汇总的错误信息。另外,如果Text属性为空,则出错时将显示该信息,是所有验证控件共有的属性(只有Text显示完才会显示)

4RegularExpressionValidator
功能:是正则表达式的意思,正则表达式

RegularExpressionValidator控件的常用属性

属性

说明

ControToValidate

要验证的控件的ID,所有验证控件都有该属性

Text

出错时的提示,使所有验证控件共有的属性

ErrorMessage

提交给汇总的错误信息。另外,如果Text属性为空,则出错时将显示该信息,是所有验证控件共有的属性(只有Text显示完才会显示)

5CustomachValidator
功能:用于自定义验证

CustomachValidator控件的常用属性

属性

说明

ControlToValidate

要验证的控件的ID

ClentValidationFunction

用于设置客户端验证的脚本函数

OnServerValidate

服务器端验证的事件方法

Text

出错时的提示,使所有验证控件共有的属性

ErrorMessage

提交给汇总的错误信息。另外,如果Text属性为空,则出错时将显示该信息,是所有验证控件共有的属性(只有Text显示完才会显示)

6ValidationSummary
功能:用于汇总所有的错误报告

ValidationSummary控件的常用属性

属性

说明

ShowMessageBox

指示是否显示弹出的提示消息

ShowSummary

指示是否显示该报告内容,用于显示提示消息的时候

日期输入控件(日历控件和JS版日历)
Calendar
日历控件

Calendar控件的常用属性和事件

属性或事件

说明

SelectedDate 属性

设置获取选择的日期

VisibleDate 属性

当前可见的日期(默认显示的月份)

TitleFormat 属性

标题格式(某月某年某月

SelectionChanged 事件

选择某日期后的事件

步骤
JS
版日历
My97DatePricker
的使用
步骤
1
、将My97DatePicker文件夹拷到网站的根目录下
2
、编写应用代码
在页面增加如下
<script language="javascript" type="text/javascript" src="My97DatePicker/WdatePicker.js"></script>
(
注意:填写相对路径,这里不可以使用"~"必须使用"..")
输入日期的文本框代码修改如下
<asp:TextBox ID="TextBox2" runat="server" CssClass="Wdate"  onFocus="new WdatePicker(this,'%Y-%M-%D',true,'whyGreen')"></asp:TextBox>
(
说明:this—表示返回日期的对象,'%Y-%M-%D'—自定义的日期格式,true—true表示带时间选择 whyGreen—皮肤的名称)

文件上传
1
、添加FileUpload控件和Button控件
2
、在Button的单击事件里编写如下代码
    protected void Button1_Click(object sender, EventArgs e)
    {
        //
获得上传文件的名称(包括扩展名)
        string fileName = FileUpload1.FileName;
        //
获得上文件将要存放的路径(File为服务器端存放文件的文件夹名)
        string strpath = Server.MapPath("File");
        //
文件上传(PostedFile——获取使用FileUpload控件上传文件的基础。SaveAs——保存上传文件的内容)
        FileUpload1.PostedFile.SaveAs(strpath + "//" + fileName);
    }
图片上传
1
、添加FileUpload控件和Button控件
<asp:FileUpload οnchange="CheckImg(this)" ID="FileUpload1" runat="server" />
//
此脚本方法是用来验证扩展名的
function CheckImg(FileUpload)
{
    //
获得选中文件的路径
    var mime = FileUpload.value;
    //
查找最后一个"."并从此处截取,然后将截取的部分转换成小写(也就是说截取的部分问文件的扩展名)
    mime = mime.toLowerCase().substr(mime.lastIndexOf("."));
    //
对比扩展名做出相应的判断
    if(mime!=".jpg")
    {
        FileUpload.value="";
        alert("
仅支持JPG格式");
    }
}
2
、在配置文件设置文件上传大小
<!--
maxRequestLength指定大小-->
<system.web>
  <httpRuntime maxRequestLength="2048"/>
</system.web>
3
、在Button的单击事件里编写如下代码
    protected void Button1_Click(object sender, EventArgs e)
    {
        //
获得上传文件的名称(包括扩展名)
        string fileName = FileUpload1.FileName;
        //
获得上文件将要存放的路径(File为服务器端存放文件的文件夹名)
        string strpath = Server.MapPath("File");
        //
获取上传文件的大小(单位为字节)
        FileUpload1.PostedFile.ContentLength;
        //
文件上传(PostedFile——获取使用FileUpload控件上传文件的基础。SaveAs——保存上传文件的内容)
        FileUpload1.PostedFile.SaveAs(strpath + "//" + fileName);
    }

7数据查询与展示:DataList

DataList控件可用于创建模板化的列表数据,可以显示诸如一行中有多列的内容,可以用任何重复结构中的数据。
使用DataList控件显示数据
1
、添加DataList控件(数据)——DataList任务——单击编辑模板——在项模板的ItemTempalte中添加Label控件——Lable任务中——单击编辑DataBindings——Lable DateBindings对话框中为Text绑定数据——首先选中字段绑定——在字段绑定下拉框中选择需要的字段——然后在选择自定义绑定进行代码表达式修改对要显示的外键字段对象进行修改来显示相应的属性——单击确定——单击结束模板编辑——在分隔符模板的SeparatorTemplate中添加分隔控件——结束模板编辑
2
、数据绑定
(1)
数据源控件绑定
ObjectDataSource 任务——单击配置数据源——单击下一步——在定义数据方法中选择Select选项中的方法——单击完成
(2)
手动绑定数据(在后置代码中编写绑定方法,在首次加载页面时调用方法)
    this.DataList1.DataSource =
调用业务逻辑层的数据访问方法();
    this.DataList1.DataBind();   
分页的实现
1
、存储过程分页
SQL
语句
Select Top pageSzie * from
表名 where 条件 and id not in (Select Top PageSize * (CurrentPageIndex-1) id from where 条件 order by 排序条件) order by 排序条件
2
、使用分页类分页
步骤
(1)
编写数据查询方法(查询所有的方法)指定PagedDataSource实例对象的数据源
(2)
分别设置允许分页、页大小、当前页的属性
(3)
指定数据显示控件的数据源为该实例对象,并绑定
示例
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;
using PracticeMyBookShopBLL;
public partial class datalistBook : System.Web.UI.Page
{
    //
分页属性
    private int Pater
    {
        get{ return (int)ViewState["Page"]; }
        set{ ViewState["Page"] = value; }
    }
    //
首次加载
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //
首次加载时设置当前页
            ViewState["Page"] = 1;
            //
首次加载时调用方法
            Databind();
        }
    }
    //
分页数据绑定
    private void Databind()
    {
        //
创建分类
        PagedDataSource pagedDataSource = new PagedDataSource();
        //
绑定数据
        pagedDataSource.DataSource = BookManager.GetHotBook();
        //
设置是否自动分页功能
        pagedDataSource.AllowPaging = true;
        //
设置每页记录数
        pagedDataSource.PageSize = 5;
        //
设置当前页
        pagedDataSource.CurrentPageIndex = Pater;
        lblCurrentPage.Text = "
" + (pagedDataSource.CurrentPageIndex + 1).ToString() + "页共" + pagedDataSource.PageCount.ToString() + "";
        SetEnable(pagedDataSource);
        this.DataList1.DataSource = pagedDataSource;
        DataList1.DataBind();
    }
    //
上一页
    protected void btnPrev_Click(object sender, EventArgs e)
    {
        Pater--;
        Databind();
    }
    //
下一页
    protected void btnNext_Click(object sender, EventArgs e)
    {
        Pater++;
        Databind();
    }
    //
根据条件设置是按钮否可用属性
    private void SetEnable(PagedDataSource pagedDataSource) {
        btnPrev.Enabled = true;
        btnNext.Enabled = true;
        if (pagedDataSource.IsFirstPage)
        {
btnPrev.Enabled = false;
        }
        if (pagedDataSource.IsLastPage)
        {
            btnNext.Enabled = false;
        }
    }
}

分页类的属性

属性

说明

CurrentPageIndex

当前页

PageCount

总页数

Count

总记录数

PageSize

每页记录数

DataSource

数据源

AllowPaging

控件是否实现自动分页功能

8常用第三方控件

添加第三方控件
在工具箱任意一个选项卡中单击右键——再单击选择项——在选择工具箱项中的.NET Framework 组建中——单击浏览——在弹出的对话框中查找要添加的第三方控件——单击打开——最后单击确定
使用FreeTextBox在线编辑录入控件
1
、添加FreeTextBox到标准工具箱——在页面中添加FreeTextBox控件即可
2
FreeTextBox控件常用属性
3
、设置FreeTextBox控件Text属性实现绑定数据(必须使用Bind进行数据绑定,如果使用Eval将无法完成目录的更新)
例:
<FTB:FreeTextBox ID="FreeTextBox1" runat="server" Text='<%# Bind("Name")%>'></FTB:FreeTextBox>
4
、错误处理
错误提示:从客户端中检测到有潜在危险的Request.From
错误原因:这是由于Asp.Net自身安全机制引起的,它屏蔽了有潜在危险的表单提交。
解决方法:在Page指令上设置ValidateRquest="false" 就可以了

使用验证码控件
1
、添加SerialNumber控件到标准工具箱——在页面中添加SerialNumber控件
2
、在后置代码中编辑验证代码
//
首次加载处理
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack) {
        this.SerialNumber1.Create(); //
首次加载页面创建新验证码
    }
}
//
判断输入的验证码是否正确,并做出相应的显示
protected void Button1_Click(object sender, EventArgs e)
{
    if (SerialNumber1.CheckSN(this.TextBox1.Text.Trim()))
    {
        this.Label1.Text = "<script>alert('
正确!');</script>";
    }
    else {
        SerialNumber1.Create();
    }
}

常用属性和方法

返回类型

方法名

说明

void

Create()

创建新验证码

bool

CheckSN(比较参数)

验证输入的验证码是否正确

session 生成验证码
1
、编写生成的验证码页面(GenerateSureCode.aspx)
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;
using System.Drawing;
public partial class GenerateSureCode : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            this.GenImg(this.GenCode(4));
        }
    }
    //
产生随机字符串
    private string GenCode(int num)
    {
        string[] source ={"0","1","2","3","4","5","6","7","8","9",
                         "A","B","C","D","E","F","G","H","I","J","K","L","M","N",
                       "O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
        string code = "";
        Random rd = new Random();
        for (int i = 0; i < num; i++)
        {
            code += source[rd.Next(0, source.Length)];
        }
        return code;
    }
    //
生成图片
    private void GenImg(string code)
    {
        Bitmap myPalette = new Bitmap(60, 20);//
定义一个画板
        Graphics gh = Graphics.FromImage(myPalette);//
在画板上定义绘图的实例
        Rectangle rc = new Rectangle(0, 0, 60, 20);//
定义一个矩形
        gh.FillRectangle(new SolidBrush(Color.Yellow), rc);//
填充矩形
        gh.DrawString(code, new Font("
宋体", 16), new SolidBrush(Color.Red), rc);//在矩形内画出字符串
   myPalette.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);//
将图片显示出来
        Session["ValidateCode"] = code;//
将字符串保存到Session中,以便需要时进行验证
        gh.Dispose();
        myPalette.Dispose();
    }
}
2
、在页面中天加一个Image图片控件(通过ImageUrl属性来获得在GenerateSureCode.aspx页面生成的验证码)
<asp:Image ID="imgValidate" ImageUrl="~/GenerateSureCode.aspx" runat="server" />
3
、在后置代码中编写如下代码
    //
此方法验证用户输入的验证码是否与生成的验证码一样
    private bool CheckSN()
    {
        string validateCode = Session["ValidateCode"].ToString();//
获得保存在Session中的验证码
        if (this.txtValidate.Text != validateCode)
        {
            Response.Write("<script>alert('
验证码输入错误,请重新输入!');</script>");
            txtValidate.Text = "";
            return false;
        }
        else
        {
            return true;
        }
    }

9用户控件和HttpHandler

用户控件
概念:用户控件是可用来实现页面中可重用的代码,是可以使我们一次编写就多处方便使用的功能块
创建用户控件
选中程序集——右键添加新项——在添加新项对话框模板中选择——Web 用户控件——单击添加
使用用户控件
直接从"解决方案资源管理器"中将用户控件拖放到要应用的页面
在应用页面获得用户控件的值(通过属性来获得)
1
、先在用户控件的后置代码中编写将要获得哪个 TextBox 控件值的属性
举例:
//TextBox
控件的IDtxtName
public string Name {
    get {
        return this.txtName.Text.Trim();
    }
    set {
        this.txtName.Text = value;
    }
}
2
、在应用页面调用获得相应的值
this.
应用页面中用户控件的ID.Name;
用户控件和页面的区别

比较

用户控件

页面

后缀名

.ascx

.aspx

指令

@Control

@Page

继承

System.Web.UI.UserControl

System.Web.UI.Page

包含

可以包含控件和其他用户控件,也可以被其他的用户控件和页面包含

它可以包含控件和和所有用户控件,但是不可以被其他页面包含

直接访问

不可以,必须包含在页面中才能发挥作用

可以

标签

不可能包含<THML>,<Body>HTML标签

可以包含所有HTML标签

编译和运行

可独立编译,但不能单独运行。不可以直接访问

可直接访问

水印的实现(指定Handler方式)
步骤
1
、创建HttpHandler程序(PictureHandler.ashx)
<%@ WebHandler Language="C#" Class="PictureHandler" %>
using System;
using System.Web;
using System.Drawing;
using System.IO;
public class PictureHandler : IHttpHandler
{
    //
将要加水印文件路径
    private const string PERSONPICTURE = "~/";
    //
水印文件路径
    private const string WATERMARK_URL = "~/Image/watermark.jpg";
    //
默认图片路径
    private const string DEFAULTIMAGE_URL = "~/Image/noperson.jpg";
   
    public void ProcessRequest(HttpContext context)
    {
        //
组合图片路径
        string path = context.Request.MapPath(PERSONPICTURE + context.Request.Params["pictureName"].ToString());
        //
声明图片对象
        System.Drawing.Image image;
        //
判断相应路径中的文件是否存在
        if (File.Exists(path))
        {
            //
加载文件
            image = Image.FromFile(path);
            //
加载水印图片
            Image watermark = Image.FromFile(context.Request.MapPath(WATERMARK_URL));
            //
实例化画布
            Graphics g = Graphics.FromImage(image);
            //
image上绘制水印
            g.DrawImage(watermark, new Rectangle(image.Width - watermark.Width, image.Height - watermark.Height, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel);
            //
释放画布
            g.Dispose();
            //
释放水印图片
            watermark.Dispose();
        }
        else
        {
//
加载默认图片
            image = Image.FromFile(context.Request.MapPath(DEFAULTIMAGE_URL));
        }
        //
设置输出类型为jpeg图片
        context.Response.ContentType = "image/jpeg";
        //
将修改的图片存入输出流
        image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        //
释放图片对象
        image.Dispose();
        context.Response.End();
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
2
、在后置代码中编写方法(AddWaterMark())
public string AddWaterMark(string path)
{
    string imageUrl;
    if (path != null)
        imageUrl = "PictureHandler.ashx?pictureName=" + path;
    else
       imageUrl = "PictureHandler.ashx?pictureName=" + null;
    return imageUrl;
}
3
、在页面中调用方法(AddWaterMark())
<img src="<%=AddWaterMark("photo/1.JPG")%>" width="260" height="195" />

水印的实现(全局Handler方式)
1
、修改配置文件——<system.web>节点里添加如下代码
<httpHandlers>
  <add verb="*" path="*.jpg" type="PictureHandler"/>     
</httpHandlers>
说明:
verb
:代表谓词(比如 GETPOSTFTP)列表,又称动词列表。可以写作"GETPOST""*"为通配符,此处标识所有的请求。
path
:访问路径,此处表示所有访问图片的访问路径的请求都将交给PictureHandler类进行处理。
"*"
为通配符,由于该目录就是专门存放图片的目录,我们将所有访问该目录下的.jpg格式文件的请求都转交给PictureHandler类进行处理。
使用该配置后,不管请求的路径中有没有实际文件,都将执行该PictureHandler类。
type
:指定逗号分隔的类/程序集组合。ASP.NET首先在应用程序的专用/Bin目录中搜索程序集DLL,然后在系统程序集缓存中搜索,这里指定的PictureHandler
就是将要编写的HttpHandler程序。
2
、创建PictureHandler(实现IHttpHandler的类默认情况下是存在App_Code目录下)
PictureHandler.cs
using System;
using System.Web;
using System.Drawing;
using System.IO;
public class PictureHandler : IHttpHandler
{
    //
水印文件路径
    private const string WATERMARK_URL = "~/Image/watermark.jpg";
    //
默认图片路径
    private const string DEFAULTIMAGE_URL = "~/Image/noperson.jpg";
    public void ProcessRequest(HttpContext context)
    {
        //
声明图片对象
        System.Drawing.Image image;
        //
判断请求的物理路径中,是否存在文件(PhysicalPath 可用于获得 HTTP 请求所对应的物理路径)
        if (File.Exists(context.Request.PhysicalPath))
        {
            //
加载文件
            image = Image.FromFile(context.Request.PhysicalPath);
            //
加载水印图片
            Image watermark = Image.FromFile(context.Request.MapPath(WATERMARK_URL));
            //
实例化画布
            Graphics g = Graphics.FromImage(image);
            //
image上绘制水印
            g.DrawImage(watermark, new Rectangle(image.Width - watermark.Width, image.Height - watermark.Height, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel);
            //
释放画布
            g.Dispose();
            //
释放水印图片
            watermark.Dispose();
        }
        else
        {
//
加载默认图片
            image = Image.FromFile(context.Request.MapPath(DEFAULTIMAGE_URL));
        }
        //
设置输出类型为jpeg图片
        context.Response.ContentType = "image/jpeg";
        //
将修改的图片存入输出流
        image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
        //
释放图片对象
        image.Dispose();
        context.Response.End();
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
3
、在页面中不用做任何修改
<img src="photo/1.JPG" width="260" height="195" />
实现.rar 压缩包的防盗链程序
1
、修改配置文件——<system.web>节点里添加如下代码
<httpHandlers>
  <add verb="*" path="Download/*.rar" type="FileHandler" />
</httpHandlers>
2
、创建FileHandler(实现IHttpHandler的类默认情况下是存在App_Code目录下)
FileHandler.cs
using System;
using System.Data;
using System.Configuration;
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 class FileHandler:IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        //UrlReferrer
:获取有关客户端上次请求的 URL 的信息,该请求连接到当前的URL
        //Host
:获取此实例的主机部分
        //Port
:获取此 URL 的端口号
        if ((context.Request.UrlReferrer == null) || (context.Request.UrlReferrer.Host == "localhost" && context.Request.UrlReferrer.Port == 1259))
        {
            //Expires
:获取或设置在浏览器上缓存的页过期之前的分钟数。如果用户在页面过期之前返回同一页面,则显示缓存的版本。
            context.Response.Expires = 0;
            context.Response.Clear();
            //ContentType
:获取或设置输出流的 HTTP MIME 类型
            context.Response.ContentType = "rar";
            context.Response.WriteFile(context.Request.PhysicalPath);
            context.Response.End();
        }
        //
如果不是本地引用,则属于盗链引用。
        else    
        {
            HttpResponse response = context.Response;
            //ApplicationPath
:获取服务器上 ASP.NET 应用程序的虚拟应用程序根路径
            response.Redirect(context.Request.ApplicationPath + "/ErrorPage.htm");
        }
    }
   
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

3
、在页面中不用做任何修改
<a href="Download/Code1.rar">
共享资源一</a>

缓存技术

一、页面缓存
整页缓存
概念:整页缓存是最简单的缓存形式,页是常用的缓存形式。它将整个页面进行缓存。
语法:
<%@ OutputCache Duration="60" VaryByParam="id" VaryByCustom="browser" %>
应用情况
不需要频繁更新数据的页面
占用大量时间和资源才能

整页缓存的主要属性

Duration

必需属性。页面应该被缓存的时间,以秒为单位。必须是正整数。

Location

指定应该对输出进行缓存的位置。
如果要指定该参数,则必须是下列选项之一:
Any——
默认值。意味着页面的输出可以缓存在客户端浏览器,缓存在任何下游的客户端(如代理服务器),或缓存在Web服务器本身
Client——
指明输出缓存只能存储在发出请求的客户端(即浏览器)的本地缓存中
Downstream——
指明输出缓存能存储在任何支持HTTP1.1缓存的设备(如代理服务器)中
None——
指明该页面禁用输出缓存
Server(ServerAndClient)——
指明输出缓存将存储在Web服务器上

VaryByParam

该属性是以分号分隔的字符串变量,以其中每一个变量作为参数传递的页都将被作为缓存处理。"none"表示不随任何参数变化,"*" 根据所有参数变化
注意:如果没有VaryByControl,该属性是必需的

VaryByControl

该属性是以分号分隔的字符串变量,用来该变用户控件的输出缓存,这些字符串代表用户控件中声明的服务器控件ID
注意:如果没有VaryByParam,该属性是必需的

VaryByCustom

用于自定义输出缓存要求,他允许在global.asax中指定自定义变动,如果该属性值是browser,则缓存将随浏览器名称和主要信息版本信息的不同而异

VaryByHeader

基于指定的标头中的变动改变缓存条目。

示例:
在页面代码的指令区添加如下代码
<%@ OutputCache Duration="60" VaryByParam="id" VaryByCustom="browser" %>
说明:VaryByParam属性的id只从上一个页面请求时的参数Response.Rediect("User.aspx?id="+id);
页面部分缓存(缓存后替换)
概念:所谓缓存后替换就是将整个页面缓存,然后替换页面中不需要缓存的部分
实现控件——Subsitutioin控件
1
、添加整页缓存指令
<%@ OutputCache Duration="120" VaryByParam="none" %>
2
、在不需要缓存的部分添加Subsitution控件
<asp:Subsitution ID="Subsitution1" runat="server" MethodName="GetNum" />
3
、在后置代码中编写Subsitutioin控件的MethodName属性方法
protected static string GetNum(HttpContext context)
{
DataTable dt = GetTicketsDataTable(3);
return dt.Rows[0]["num"].ToString();
}
注意:
Subsitutioin
控件 MethodName属性所调用的方法必需满足三个条件
(1)
必需是静态(static)方法
(2)
返回类型必需是string
(3)
参数类型必需是HttpContext类型
二、数据缓存(应用程序缓存)
概念:应用程序缓存是用来存储与应用程序相关的对象,主要是由Cache类来实现的。
命名控件
using System.Web.Caching;
添加缓存
1
、指定键和值
   Cache["key"] = "value";
  
这种方法添加缓存最方便,但是如果需要设置缓存的有效期、依赖项等特性,它就变得无能为力了
 2
、使用Add()方法——只用于在ASP.NET缓存中添加新的缓存项(如果用它覆盖现有的缓存项,则会失败)
   Cache.Add("key","value",CacheDependency,DateTime,TimeSpan,CacheItemPriority,CacheItemRemovedCallbac);
  
这种方法适用于需要设置缓存的有效期、依赖项等特性的缓存,但是要注意它的7个参数必须写完整才能生效,所以灵活性不够好。
  
参数说明:
  
第一个参数:key——表示引用缓存对象的键()
  
第二个参数:value——表示要缓存的对象()
  
第三个参数:CacheDependency——表示添加依赖项(允许指定一个文件或缓存键。如果文件发生变化,对象就被删除。如果缓存键发生变化,对象也被删除)
  
第四个参数:DateTime——表示绝对过期时间(指明缓存数据过期的时间)
  
第五个参数:TimeSpan——表示可调过期时间又叫弹性的过期时间。指明缓存数据在上一次访问后可以在缓存中保留多长时间(也就是说在相对过期时间内,以相对过期时间剩余时间点为起点再进行相对过期时间。TimeSpan.Zero表示没有指定可调过期时间)()
  
第六个参数:CacheItemPriority——表示优先级,当在缓存被填满的时候删除那些优先级低的数据
  
第七个参数:CacheItemRemovedCallbac——表示回调自定义的方法(示例:可以在缓存项从缓存中删除时要求通知),它的类型是CacheItemRemovedCallback类型的
   
示例一:(指定一个5分钟绝对过期时间)
    //
创建一个指定5分钟绝对过期时间的缓存
Cache.Add("key","value",null,DateTime.Now.AddMinutes(5),TimeSpan.Zero,CacheItemPriority.Normal,null);     
  
示例二:(指定一个5分钟的弹性过期时间,没有指定绝对过期时间)
    //
创建一个指定5分钟弹性过期时间的缓存
     Cache.Add("key","value",null,DateTime.MaxValue,TimeSpan.FromMinutes(5),CacheItemPriority.Normal,null);  
  
示例三:(过期时间也取决于一个文件的修改)
     //
过期时间取决于test.xml文件修改。也就是说当test.xml文件内容修改时此缓存就会过期
     CacheDependency dependency = new CacheDependency("C://test.xml");
     //
创建一个依赖文件修改而过期的缓存
     Cache.Add("key","value",dependency,DateTime.MaxValue,TimeSpan.FromMinutes(5),CacheItemPriority.Normal,null);  
  
示例四:(过期时间取决于缓存中另一项的修改)
     //
当缓存key1的值修改时,缓存key2就会过期
     Cache.Add("key1","value",null,DateTime.MaxValue,TimeSpan.Zero,CacheItemPriority.Normal,null);
     //
添加爱到数组中
     String[] dependencyKeys = new String[1];
     dependencyKeys[0] = "key1";
     CacheDependency dependency = new CacheDependency(null, dependencyKeys);
     //
创建一个依赖另一个缓存修改而过期的缓存
     Cache.Add("key2","value",dependency,DateTime.MaxValue,TimeSpan.Zero,CacheItemPriority.Normal,null);
  
示例五:(缓存过期后回调方法)  
     //
缓存过期将要调用的方法
     public void ItemRemovedCallback(String key, Object value, CacheItemRemovedReason reason){}
     //
创建一个当指定5分钟的弹性过期时间后调用ItemRemovedCallback方法的缓存
     Cache.Add("key","value",null,DateTime.MaxValue,TimeSpan.FromMinutes(5),CacheItemPriority.Normal,new CacheItemRemovedCallback(this.ItemRemovedCallback));  

优先级值顺序

含义

High

设为此优先级的缓存项是最不可能在内存不足时被删除的

AboveNormal

设为此优先级的缓存项比优先级为Normal或以下的缓存项更优先保留

Normal

设为此优先级的缓存项比优先级为BelowNormalLow的缓存项更优先保留

BelowNormal

这是倒数第二级的优先级;设为此优先级的缓存项只比优先级设为Low的缓存项更优先保留

Low

设为此优先级的缓存项是最有可能在内存不足时被删除的

Default

缓存项的优先级的默认值是Normal

NotRemovable

当缓存项设为此优先级时,是在告诉ASP.NET即使是内存不足,也不要从缓存中删除它

3、使用Insert()方法——用于覆盖ASP.NET缓存中现有的缓存项。
  
这种方法可以实现多种方式的方法重载,使用起来比较灵活(但主要用法和Cache.Add用法差不错)
   Cache.Insert("key","value");
  
示例一:(键值添加)  
     Cache.Insert("key1","value1");    
  
示例二:(添加依赖项的缓存)  
     Cache.Insert("key","value",System.Web.Caching.CacheDependecy(null,dependencies));    
  
示例三:(添加有效过期时间的)  
     Cache.Insert("key","value",DateTime.Now.AddMinutes(1d),System.Web.Caching.Cache.NoSlidingExpiration);
    
示例四:(添加优先级的缓存)
     Cache.Insert("key","value",null,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.CacheItemPriority.High,null);
4
、检索缓存
    if (Cache["key"] != null)
    {
       //
处理语句
    }
5
、移除缓存
   (1)
自动移除  
     
出现缓存已满、或过期、依赖项更改等情况时,缓存项就会自动移除     
   (2)
显示移除  
      Cache.Remove("key");
三、禁止使用缓存
1
、客户端取消
   <html>
   <head>
     <meta http-equiv="Expires" CONTENT="0">
     <meta http-equiv="Cache-Control" CONTENT="no-cache">
     <meta http-equiv="Pragma" CONTENT="no-cache">
   </head>
   <body>
   </body>
   </html>
2
、服务器具端取消
   Response.Buffer = true;
   Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
   Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
   Response.Expires = 0;
   Response.CacheControl = "no-cache";
   Response.Cache.SetNoStore();
3
Global里面: 
   protected void Application_BeginRequest(Object sender,EventArgs e) 
   { 
        HttpContext.Current.Response.Cache.SetNoStore(); 
   }
   //
禁止后退
   <%@ OutPutCache Location="None"%>
     
说明:Global 申请全局变量,一般定义在模块中,不可在程序文件中定义
         public
可以在模块中定义,也可在程序文件中定义。
4
、页面基类:
   public class PageBase : Page 
   { 
       public PageBase(){} 
       protected override OnLoad(EventArgs e )
       { 
          Response.Cache.SetNoStore(); 
          base.OnLoad(); 
       } 
   }
5
、最简单的办法 :URL后面随机的加一些没用的参数(IE是用过URL来控制缓存的,这样就解决了)
  
示例:http://xxx/xxx/xxx.jsp?p=xxx

 

1使用AJAX扩展控件

常用扩展控件列表

控件名

说明

AutoComplete

根据用户输入的前几个字母或汉字给出相关提示

Accrdion

分组菜单折叠

Calendar

通过客户端方法完善了刷新、焦点获取、自动隐藏的日历控件,可自由绑定文本框一显示时间

CollapsiblePanel

折叠面板

ModalPopup

弹出模式窗口

Tabs

选项卡控件

Rating

分级控件

FilteredTextBox

具备文本框的过滤特性,控制用户输入值的范围

DropShadow

实现各种阴影

CascadingDropDown

级联下拉菜单

DragPanel

可自由拖拽的面板

Slider

以滑块的形式显示数据

AutoCompleteExtender——提示控件
功能:它可以用来实现智能提示功能,根据用户输入的前几个字母或汉字给出相应的提示。

AutoCompleteExtender控件常用属性

TargetControlID

要实现自动完成功能的控件ID

ServicePath

Web Service的路径

SerivceMethod

要使用的Web Service方法

MinimumPrefixLength

用户输入多少个字母才出现提示

EnableCaching

是否启用缓存

CompletionSetCount

提示数据的行数

1、先编写WebService方法
        using System;
        using System.Web;
        using System.Collections;
        using System.Web.Services;
        using System.Web.Services.Protocols;
        using WebChat.BLL;
        /// <summary>
        /// UserWebService
的摘要说明
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.Web.Script.Services.ScriptService()]
        public class UserWebService : System.Web.Services.WebService
        {
            public UserWebService()
            {
                //
如果使用设计的组件,请取消注释以下行
                //InitializeComponent();
            }
            [WebMethod]
            public string[] GetUserByPreName(string prefixText, int count)
            {
                return UserManager.GetUserByPreName(prefixText,count);
            }
        }
   
注意:
    (1)
创建Web Service方法必须加上[System.Web.Script.Services.ScriptService()]特性,它是Web Service专门为AJAX订制的特性在调用Web Service时必须加上此特性
    (2)
要调用的Web Service方法的两个参数名和类型是固定的,返回类型必须是string[]
    //
业务逻辑层调用数据访问层的方法
        public static string[] GetUserByPreName(string foreName, int count)
        {
            return UserService.GetUserByPreName(foreName,count);
        }
    //
数据访问层的代码编写返回值为string[]数组
        public static string[] GetUserByPreName(string foreName, int count)
        {
            IList<User> users = new List<User>();
            List<string> results = new List<string>(count);
            string sql = "select top "+count+" * from Users where name like '" + foreName + "%'";
            users = GetUsersBySql(sql); 
            foreach (User item in users)
            {
                results.Add(item.Name);
            }
            return results.ToArray();
        }
        private static IList<User> GetUsersBySql(string safeSql)
        {
            List<User> list = new List<User>();
            try
            {
                DataTable table = DBHelper.GetDataSet(safeSql);
                foreach (DataRow row in table.Rows)
                {
                User user = new User();
                user.Id = (int)row["Id"];
                user.LoginId = (string)row["LoginId"];
                user.LoginPwd = (string)row["LoginPwd"];
                user.Name = (string)row["Name"];
                user.Address = (string)row["Address"];
                user.Phone = (string)row["Phone"];
                user.Mail = (string)row["Mail"];
                user.UserState = UserStateService.GetUserStateById((int)row["UserStateId"]); //FK
                user.UserRole = UserRoleService.GetUserRoleById((int)row["UserRoleId"]); //FK
                user.Gender = (int)row["Gender"];
                 list.Add(user);
                }
                return list;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return null;
            }
        }
2
、在页面中添加一个TextBox控件IDtxtUserName——在添加AutoCompleteExtender控件——修改AutoCompleteExtender控件属性
<cc1:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="txtUserName" ServicePath="UserWebService.asmx" SerivceMethod="GetUserByPreName" MinimumPrefixLength="1" EnableCaching="true" CompletionSetCount="10" >
    </cc1:AutoCompleteExtender>
Accordion——
菜单折叠效果控件
功能:用来做导航菜单和分组数据的展示

Accrdion的主要属性和模板

SelectedIndex

表示默认选择的面板索引

HeaderCssClass

表示整个菜单的标题样式

ContentCssClass

表示菜单的内容样式

AutoSize

表示Accordion内容的显示方式,主要有NoneLimitFill三种,其中None表示可以被无限地拉伸和收缩

Panes

PanesAccordion控件的内容所在,它里面只能包括AccordionPane控件。可以有多个PantsAccordionPane

HeaderTemplate

Accordion的标题模板

ContentTemplate

Accordion的内容模板

Accordion的使用
实现静态效果
步骤:创建AJAX网站——添加Accordion控件——AccordionPans下添加两个AccordionPane控件——然后在网页代码中修改每个AccordionPaneHeaderTemplate标题模板和ConentTemplate内容模板——还要给AccordionPaneHeaderCssClass标题样式和ContentCssClass内容样式动态生成Accordion菜单
步骤:创建AJAX网站——布局页面向网页中添加Accordion控件——实现动态添加
示例
1
、在布局页面向网页中添加Accordion控件
2
、编写样式:
    <style type="text/css">
      .headerBg
      {
      cursor:hand;
      text-align:center;
      width:160px;
      height:21px;
      color:#000000;
          font-family:
宋体;
      font-size:10pt;
      font-weight:bold;
      background-image:url(../images/leftmenubg.gif);
      line-height:21px;
      }   
      .contentBg
      {
      width:160px;
      text-align:center;
      cursor:hand;
      font-family:
宋体;
      font-size:9pt;
      line-height:21px
      }
    </style>
 3
、编写控件代码:
    <cc1:Accordion ID="Accordion1" runat="server" Height="360px" AutoSize="fill" HeaderCssClass="headerBg" ContentCssClass="contentBg">
    </cc1:Accordion>

4
、修改后置代码实现动态加载
//
动态添加方法
    protected void DisplayHotBooks()
    {
        //
得到所有书的分类信息
        IList<Category> hList = CategoryManager.GetAllCategories();
        //
循环将书的分类名添加到Accordion控件标题中
        foreach(Category hItem in hList)
        {
            //
实例化一个AccordionPane控件
            AccordionPane ap = new AccordionPane();
            //
实例化一个标签控件用来显示分类名
            Label lblCategoryMenu = new Label();
            //
指定LabelText属性为分类名
            lblCategoryMenu.Text = hItem.Name;
            //
Label控件添加到AccordionPane的标题部分
            ap.HeaderContainer.Controls.Add(lblCategoryMenu);
            //
根据图书类型获得所有图书
            IList<Book> cList = BookManager.GetBooksByCategoryId(hItem.Id);
            //
循环将图书信息添加到AccordionPane控件内容中
            foreach(Book cItem in cList)
            {
                //
实例化一个HyperLink控件
                HyperLink hlBookMenu = new HyperLink();
                //
指定HyperLinktext属性为图书标题
                hlBookMenu.Text = cItem.Title + "<br>";
                //
知道连接属性为书详细页面
                hlBookMenu.NavigatUrl = "BookDetail.aspx?bid="+hItem.Id;
                //
HyperLink控件添加到AccordionPane的内容部分
                ap.ContentContainer.Controls.Add(hlBookMenu);
             }
        this.Accordion1.Panes.Add(ap);
        }
    }
CollapsiblePanel——
折叠显示或隐藏控件
功能:可以使用按钮、图片等控制实现折叠效果来实现无刷新显示或隐藏指定面板中的内容的控件

注意:做好使用图片来控制(使用图片可以实现无闪刷新)

CollapsiblePanel的属性

属性

说明

TargetControID

被显示或隐藏的PanelID

CollapsedSize

折叠后的尺寸

ExpandedSize

展开后的尺寸

Collapsed

默认Panel是否处于折叠状态

ExpandControlID

激发伸展效果的控件ID

CollapseControlID

激发折叠效果的控件ID

AutoCollapse

失去焦点时是否自动折叠

AutoExpand

失去焦点是是否自动展开

ScrollContents

Panel内是否显示滚动条

CollapsedText

折叠后显示的文本信息

ExpandedText

展开后显示的文本信息

ImageControlID

使用图片实现折叠和展示时图片的ID

ExpandedImage

实现展开时使用的图片路径

CollapsedImage

实现折叠时使用的图片路径

ExpandDirection

展开方向,有水平和垂直两种

示例
1
、创建AJAX网站
2
、布局页面  
               <!--
1里边是panel,panel里边是Accordion-->
        <div id="div1" style="float:left">
            <asp:Panel ID="pnlHidden" runat="server" >
                <cc1:Accordion ID="Accordion1" runat="server" HeaderCssClass="headerBg" ContentCssClass="contentBg">
                </cc1:Accordion>
            </asp:Panel>
        </div>
       
        <!--panel
里边是层2和层3-->
        <asp:Panel ID="pnlShow" runat="server">
            <div id="div2" style="float:left; width:20px;height:37%;padding-top:110px;text-align:center">
                <asp:Image ID="Image1" runat="server" ImageUrl="~/Images/toleft.gif" />
            </div>
            <div id="div3" style="float:left">
            </div>
        </asp:Panel>
3
、向网页中添加CollapsiblePanel控件——编写控件代码
        <cc1:CollapsiblePanelExtender ID="CollapsiblePanelExtender1" runat="server"
             TargetControlID="pnlHidden"
             CollapsedSize="0"
             ExpandedSize="180"
             Collapsed="false"
             ExpandControlID="Image1"
             CollapseControlID="Image1"
             AutoCollapse="false"
             AutoExpand="false"
             ScrollContents="false"
             CollapsedText="
显示"
             ExpandedText="
隐藏"
             ImageControlID="Image1"
             ExpandedImage="../Images/toleft.gif"
             CollapsedImage="../Images/toright.gif"
             ExpandDirection="Horizontal">
        </cc1:CollapsiblePanelExtender>
 Rating——
评分控件
功能:实现等级评分功能

CurrenRating

当前默认等级

MaxRatings

最大等级

StarCssClass

等级星的样式

EmpteyStarCssClass

未被选中的等级星的显示样式

FilledStarCssClass

选中的等级星的显示样式

WaitingStartCssClass

更改等级星选中状态时的显示样式

OnChanged

等级变化触发的事件

1、创建网页——添加Rating控件
2
、编写样式
    <style type="text/css">
      .ratingStar{width:28px;height:28px;cursor:pointer;background-repeat:no-repeat;}
      .filedRatingStar{background-image:url(images/filled.gif);}
      .emptyRatingStar{background-image:url(images/empty.gif);}
      .watingRatingStar{background-image:url(images/waiting.gif);}
    </style>
3
、编写控件代码
    <cc1:Rating ID="Rating1" runat="server" CurrentRating="3" MaxRating="5" StarCssClass="ratingStar" FilledStarCssClass="filedRatingStar" EmptyStarCssClass="emptyRatingStar" WaitingStarCssClass="watingRatingStar"  OnChanged="Rating1_Changed" >
    </cc1:Rating>
4
、编写后置代码中的星等级更改OnChanged事件
   protected void Rating1_Changed(object sender, AjaxControlToolkit.RatingEventArgs e)
    {
        if (int.Parse(e.Value) > 2) {
            //
提示信息
        }
        //if (Rating1.CurrentRating > 2) {
            //
提示信息
        //}
    }
Calendar——
日厉控件
功能:获得时间

解决了传统ASP.NET三个问题
1
、不能实现日历控件和TextBox 的只能绑定
2
、选定日期后无法自动隐藏
3
、选定日期后需要刷新页面

Calendar控件属性

TargetControlID

与日历邦定的TextBox控件的ID

Format

日历显示的日期格式

CssClass

日历的样式

PopupButtonID

通过选择按钮弹出日期时的按钮的ID

示例
1
、设置页面添加Calendar控件和TextBox控件
2
、编写页面控件代码
   <div>
    <cc1:CalendarExtender ID="CalendarExtender1" runat="server"  CssClass="calendar" TargetControlID="TextBox1" PopupButtonID="Button1" Format="yyyy-MM-dd">
    </cc1:CalendarExtender>
    <asp:TextBox ID="TextBox1" runat="server">
    <asp:Button ID="Button1" runat="server" Text="
获取时间" />
   </div>
ModalPopup——
模式窗口控件
功能:用来显示模式弹出窗口

ModalPopup控件属性

TargetControlID

用来控制弹出窗口的控件ID

PopuControlID

要弹出的控件ID

DropShadow

弹出的控件是否有阴影效果

OkControlID

确定按钮的ID

CancelControlID

确定按钮的ID

Drag

是否允许拖拽

PopupDragHandleControlID

允许拖拽的控件ID

BackgroundCssClass

弹出控件后其他部分的样式

X

水平坐标

Y

垂直坐标

ModalPopup控件的常用方法

方法

说明

Show()

在需要时用来控制模式窗口的显示效果

Hide()

在需要时用来控制模式窗口的隐藏效果

    

步骤:创建AJAX网站——添加一个Panel控件——添加一个隐藏文本域——最后添加ModalPopup控件
示例
//
弹出的后背景的样式
  <style type="text/css">
   .otherBgCss{background-color:#cccccc;}
  </style>
//
页面代码布局
  <asp:Panel ID="Panel1" runat="server" >
   <asp:TextBox Id="txtLogin" runat="server"></asp:TextBox>
   <asp:TextBox Id="txtPwd" runat="server"></asp:TextBox>
   <input type="image" runat="server" id="btnOK" src="images/btnOK.jpg" />
   <input type="image" runat="server" id="btnCancel" src="images/btnCancel.jpg" />
   </asp:Panel>
  <input id="hid" type="hidden" runat="server" />
  <ccl:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="hid" PopupControlID="Panel1" DropShadow="true" OkControlID="btnOK" CancelControlID="btnCancel" Drag="true" PopupDragHandleControlID="Panel1" BackgroundCssClass="otherBgCss">
  </ccl:ModalPopupExtender>
//
后置代码中调用
ModalPopupExtender1.Show();
Tabs——
选项卡控件
功能:可以在一个页面上实现多个选项卡

Tabs属性

属性

说明

HeaderText

表示选项卡的标题

HeaderTemplate

选项卡的标题模板

ContentTemplate

选项卡的内容模板

ActiveTabIndex

默认显示的选项卡索引(索引从0开始)

步骤:创建AJAX网站——添加一个Tabs控件
  <ccl:TabContainer ID="TabContainer1" runat="server" ActiveTabIndex="2">
    <ccl:TabPanel ID="TabPanel1" runat="server" HeaderText="
用户1">
    </ccl:TabPanel>
    <ccl:TabPanel ID="TabPanel2" runat="server" HeaderText="
用户2">
    </ccl:TabPanel>
    <ccl:TabPanel ID="TabPanel3" runat="server" HeaderText="
用户3">
    </ccl:TabPanel>
  </ccl:TabContainer>

2使用AJAX核心控件

核心组件
AJAX Extensions
ASP.NET AJAX 框架的核心组件
AJAX Extensions
核心组件主要包括 ScripManagerUpdatePanelUpdateProgressTrimerScripMangaerProxy
注:使用AJAX控件必须创建AJAX网站
ScripManager——
全局脚本控制器
它在每个AJAX程序中必须有,必须只有一个,并且在所有的其他AJAX控件之前使用
<asp:ScriptManager ID="ScriptManager1" runat="server" >
</asp:ScriptManager>
UpdatePanel——
更新面板
实现页面无刷新效果
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
</asp:UpdatePanel>

UpdatePanel控件的属性和元素

UpdateMode属性

表示该更新面板采用何种方式来获取服务器端的资源
有两种模式
Always—
在每次客户端浏览器向服务器请求的时候,都无条件刷新该更新面板中的内容。(默认模式)当设置为AlwaysTriggers属性将不生效
Conditional—
有处发条件的更新,只更新本Panel里的内容。

UpdatePalte子元素

<ContentTemplate>—使用更新面板的内容模板,这和GridView等控件的模板类似,可以在其中添加任何控件。
<Triggers>—
是更新面板的触发器,只有在触发条件满足后才更新<ContentTemplate>元素中的内容。

UpdateProgress——等待界面
它用来在更新过程中给出提示,它可以起到类似于进度条的功能。(一般将此控件放在UpdatePanel)
登录示例
1
、在页面中添加UpdatePanel控件——UpdatePanel控件里添加UpdateProgress控件(代码如下)
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
      <div id="div1" runat="server">
       <div style="text-align:center; font-size:10pt"> 
         <asp:UpdateProgress ID="UpdateProgress1" runat="server">
          <ProgressTemplate>
          
正在加载,请稍后.....
          </ProgressTemplate>
         </asp:UpdateProgress>
        
用户名:<asp:TextBox ID="txt_LoginId" runat="server" CssClass="inputCss" Width="145px"></asp:TextBox></div>
         <div style="text-align:center; font-size:10pt">
码:<asp:TextBox ID="txt_LoginPwd" runat="server"  CssClass="inputCss" Width="146px"></asp:TextBox></div>
         <div style="height:20px; padding-top:9px">
           <asp:ImageButton ID="imgBtnLogin" ImageUrl="images/login.jpg" runat="server" OnClick="imgBtnLogin_Click" />
           <asp:ImageButton ID="imgBtnRegister" ImageUrl="images/register.jpg" runat="server" OnClick="imgBtnRegister_Click" />
         </div>
        </div>
        <div id="div2" runat="server" style="display:none" >
        <div style="font-weight:bold;color:red">
欢迎进入新语聊天系统<a href="Login.aspx"><font color="red">离开</font></a></div>
        <div style="font-size:10pt; color:red"><asp:Label ID="lblUserInfo" runat="server"></asp:Label></div>
        <div style="height:20px; padding-top:9px">
           <asp:ImageButton ID="imgBtnManage" ImageUrl="images/gomanage.jpg" runat="server" OnClick="imgBtnManage_Click" />
           <asp:ImageButton ID="imgBtnChat" ImageUrl="images/gochat.jpg" runat="server" OnClick="imgBtnChat_Click" />
        </div>
      </div>
    </ContentTemplate>
</asp:UpdatePanel> 
2
、后置代码实现的登录时的等待效果
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;
using WebChat.BLL;
using WebChat.Models;
public partial class Login : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void imgBtnLogin_Click(object sender, ImageClickEventArgs e)
    {
        User user;
        if (UserManager.Login(this.txt_LoginId.Text, this.txt_LoginPwd.Text, out user))
        {
            div1.Style.Add("display", "none");
            System.Threading.Thread.Sleep(2000); //
实现睡眠线程
            div2.Style.Add("display", "block");
            lblUserInfo.Text = "
您好:"+user.Name;
            Session["CurrentUser"] = user;
            if (user.LoginId == "admin")
            {
                imgBtnManage.Visible = true;
            }
            else
            {
                imgBtnManage.Visible = false;
            }
        }
        else
        {
            //AJAX
实现弹框
            ScriptManager.RegisterStartupScript(this.imgBtnLogin, this.GetType(), "warning", "alert('
用户名或密码不正确,请重新填写');", true);
            //ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.UpdatePanel1.GetType(), "", "alert('
用户名或密码不正确,请重新填写');", true);
        }
    }
    protected void imgBtnManage_Click(object sender, ImageClickEventArgs e)
    {      
        Response.Redirect("SysManage/UserManage.aspx");
    }
    protected void imgBtnChat_Click(object sender, ImageClickEventArgs e)
    {
        Response.Redirect("Chat/ChatMain.aspx");
    }
    protected void imgBtnRegister_Click(object sender, ImageClickEventArgs e)
    {
        Response.Redirect("SysManage/Register.aspx");
    }
}
Timer——
定时控件
用于间隔一定的时间自动刷新页面或完成特定的任务

使用UpdatePanel控件和Timer控件实现定时无闪刷新
示例:
1
、在页面中添加UpdatePanel控件——将要需要定时刷新的控件放在UpdatePanel控件里
2
、添加Timer控件——设置Interval属性来控制Timer的时间间隔——并且指定TimerOnTick事件实现数据绑定
示例:
//
实现数据重新绑定
    protected void Timer1_Tick(object sender, EventArgs e)
    {
        this.DataList1.DataSource = MessageManager.GetAllMessage(2);
        this.DataList1.DataBind();
        this.DataList2.DataSource = MessageManager.GetAllMessage(1);
        this.DataList2.DataBind();
    }
3
、将UpdatePanel控件和Timer控件关联起来——单击Triggers属性——在弹出的UpdatePanelTrigger集合编辑器对话框中的成员区单击添加——AsynPostBack属性中指定ControlIDTimerEventNameTrimerTick事件
在已有项目中使用AJAX环境配置
1
、修改Web.Config在把使用的Web.Config文件中的controls节点和httpHandlers等相关节点代码复制到没有使用模板的Web.Config文件中
示例(System.web节点里添加如下内容)
<configuration>
  <system.web>
    <pages>
      <controls>
       <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </controls>
    </pages>
    <compilation debug="true">
      <assemblies>
        <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <add assembly="System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      </assemblies>
    </compilation>
    <httpHandlers>
      <remove verb="*" path="*.asmx"/>
        <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
      </httpHandlers>
    <httpModules>
      <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </httpModules>
  </system.web>
</configuration>
2
、在现有项目上添加AjaxControlToolkit.dll引用

3使用Web Service 

创建Web Service
步骤:
1
、添加Web Service到页面
选中项目单击右键——选择添加新项——在添加新项的对话框中选择 Web 服务 ——单击添加
2
、根据要求修改[WebMethob]下面的方法(注意只有加上[WebMethob]标记的方法才能在发布时使用)
发布Web Service
1
、创建虚拟目录
开始——程序——管理工具——Internet 信息服务(IIS)管理器——选择本地计算机——网站——默认网站——右键单击——新建——
在弹出的虚拟目录向导对话框中选择下一步——输入虚拟目录别名——单击下一步——单击浏览选择网站内容目录——单击下一步——选择权限——
单击下一步——单击完成
2
、部署网站
(1)
部署前的准备
Web.config中关闭调试功能(修改Web.config代码将<compilation debug="true"/>true改为false。原因:在开发过程中,我们常打开调试功能,以方便排错,但是这样会把一些调试信息插入编译好的dll中,降低应用程序的性能)
使用Release(发行版)的方式编译应用程序(在解决方案里选择Release)
(2)
复制站点(有三种方式)(会将源码一同复制过去不安全)
a
、将编译好的网站复制到刚才创建的虚拟目录下即可
b
、使用Dos命令复制网站——xcopy 源目录 目标目录 /f /e /k /h
c
、使用VS自带的工具——选中网站——在解决方案资源管理器——单击复制网站——在对话框中选择连接——在弹出对话框中选择虚拟目录——单击打开——
将原网站的文件复制到远程网站上
(3)
、发布预编译站点
选中网站——单击右键——选择发布网站—— 目标位置栏 中选择虚拟目录路径——单击打开——然后根据需求选择下面相应的选项——单击确定
3
、调用Web Service
Windows
应用程序和Web 应用程序调用如下
步骤:
(1)
选中项目——单击右键——选择添加Web引用——在弹出的对话框的URL下拉框中添加发布以后的网址——单击前往——然后修改Web引用名——单击添加引用
程序使用
(2)
修改代码
Web
引用名.Web Service 对象名 = new 程序名.Web引用名.Web Service();
对象名.方法();
注:不是本项目的访问Web Service 必须启用匿名访问
开始——程序——管理工具——Internet 信息服务(IIS)管理器——选择本地计算机——网站——默认网站——
选择虚拟目录——单击右键——选择属性——在属性对话框中选择目录安全性——在身份和访问控制栏里单击编辑——在弹出的身份验证方法对话框的启用匿名访问栏将多选框勾上——单击确定

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值