笔记不涉及数据库SQL Server 2008的使用,随意练习一下控件使用(认识页面布局和后台代码)。
[VS2008 数据库 IIS网站服务器]
首次启动VS2008时选中Visual C#进行设置。VS2008建立的网站项目拥有微型网站服务器的功能,项目目录就是一个Web站点。当运行VS2008网站项目时,浏览器会运行项目下的Default.aspx文件,将其运行结果显示在浏览器之上。利用VS2008就可以进行网页学习,当需要数据库时可再进行VS2008与SQL Server 2008的配置,当要提供他人访问网站功能时再进行ISS与二者的配置。[个人理解]
[网页]
网页由界面元素及逻辑代码组成。界面元素指网页界面上的控件(如文本输入框,按钮),逻辑代码指当点击诸如按钮后会调用的代码。像按钮这样的控件,都会有一个事件响应函数。
[网页编辑练习]
1. 嵌入式编码
用管理员身份打开VS2008,文件 >>新建 >>网站 >> ASP .NET网站,选择网站项目目录(Web站点目录)。
(1)使用控件编辑网页页面
打开Default.aspx文件,切换到设计模式中,就可以在工具箱中拖需要的控件到设计模式页面之上了。这些控件除了具有特定的功能(如可以在TextBox中输入文本)外其内部封装了一些属性和函数,可以通过控件的id来访问它们。
拖入控件:
在设计模式中拖入了3个<div>(并在其中两个写了文字),一个TextBox及一个按钮。每往页面中拖入一个控件时都可以选中此控件,然后右键选择属性,在属性框内设置每个控件的属性,如id,标题等。标题会在页面直接显示(如按钮的确定),id比较重要,在编码时可能会用到。
此时,再切换到Default.aspx的源码模式中,就可以各控件对应的源代码。在源码模式下直接编写这些代码和在设计模式下拖控件是等效的。以下是拖入控件后在Default.aspx文件中的<body>…</body>标记对中增加的代码:
<div>
你最喜欢哪个城市?</div>
<div>
输入你最喜欢的城市吧:<asp:TextBox ID="TextInputBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="确定" />
</div>
</form>
<div id="City">
</div>
当运行项目时,在浏览器之上可以呈现刚拖入的控件和文字,但点击确定按钮时什么也不会发生(本来什么也没做)。如果要想在点击确定按钮后发生点什么,那就需要为按钮设置一个事件和此事件对应的响应函数。
(2)为控件编写响应函数
在Default.aspx设计模式下双击按钮,将在Default.aspx.cs生产的函数剪切到Default.apsx文件中,并为这个函数新建一个<script>…</script>标记对,并将其放在<head>…</head>标记对中,然后为其编写如下代码:
<script language="C#" runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
City.InnerHtml = "<br>" + TextInputBox1.Text + "?" + "得了吧,这里连一家便宜的饭店都没有!";
}
</script>
City就是设计模式界面的最后一个<div>控件的id,InnerHtml是<div>的一个内部属性。TextInputBox1是输入框控件的id。language="C#"表示用C#语言来编写<scrip>…</script>标记对的代码。这个函数在确定按钮被点击时被调用,查看按钮对应的源码,对按钮设置的事件就是onclick事件,而这个函数就是点击它的事件响应函数。
添加事件响应函数后再运行一下这个项目,点击浏览器上的确定按钮后的效果:
编码方式有多种,像后台编码(在Default.aspx.cs文件中编码)和嵌入式编码(在Default.aspx文件中的某个标记对中编码)。
2 C#基础
C#基础知识可在VS2008的控制台程序下进行编程练习。
(1)C#的诞生
微软为了摆脱java诞生为其带来的困扰,就设计.NET和.NET核心语言C#来进军互联网。C#由C和C++衍生而来,是基于C和C++的。如果想要作为一个.NET专业开发人员,不但要掌握.NET的基础知识还要掌握.NET的专用技术。
(2)C#程序结构
一个控制台的C#程序结构:
引入命名空间(using)、在命名空间内(namespace)定义(继承)类和,然后在命名空间的Main()函数中调用这些类。
[1]循环语句
C#中多了一个foreach,用法跟linux bash脚本中的for用法相似。其余语法跟C一致。
[2]结构体
C#的结构体由数据成员和函数成员两部分构成。可以用public等关键字声明成员访问属性。创建结构体对象时用new。非指针结构体变量访问结构体成员跟C一样。
[3]类
C#类跟C++类的使用思想一致。C++中可改写的函数用virtual,C#用override。构造函数跟C++一致,跟类同名且可重载。也具有相同的继承方式。[对C++的了解很表面,所以C#和C++面向对象的比较也是个人浅层次的]
3用户登录(Response)
(1)新建工程
用VS2008新建一个Web网站项目。在解决方案资源管理器中选中项目,文件 >>新建 >> Web窗体,这样就会默认创建Default2.aspx,勾选将代码放在单独的文件中,这样就会再新建其后台文件Default2.aspx.cs。选中项目,右键新建名为images的文件夹,往此文件夹内添加一张图片。
(2)网页设计
将登录界面控件放在Default.aspx文件的设计模式中。
(2)后台编码
在Default.aspx设计模式中双击“看不清楚”,“登录”按钮,会在Default.aspx.cs中生成对应的按钮点击事件响应函数。
[1] 随机验证码的生成
//自定义随机返回字符串函数
public string random(int n)
{
string strchar = "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 1 2 3 4 5 6 7 8 9 0";
//将strchar以空格分开得到的字符保存在array数组中
string[] array = strchar.Split(' ');
string code = "";
int temp = -1;
Random rand = new Random();
for(int i = 0; i < n; ++i)
{
if(temp != -1)
{
rand = new Random(i * temp * unchecked( (int)DateTime.Now.Ticks ) );
}
int t = rand.Next(61);
temp = t;
code += array[t];
}
return code;
}
- Random类表示随机数生成器,一种能够产生满足某些随机性统计要求的数字序列。
- Random的构造函数Random(Int32 seed),使用不同的seed值可以可以产生不同的随机值。
- Random的Next(Int32 n)返回一个小于n的非负随机数。
[2]页面首次加载及点击看不清楚按钮时调用随机数生成函数
//如果是第一次访问Default.aspx页面,则为验证码(code)赋值一个随机码
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
code.Text = random(4);
}
}
//当看不清验证码时,会再更换一下验证码
protected void change_code_Click(object sender, EventArgs e)
{
code.Text = random(4);
}
[3]点击登录按钮跳转到另一个页面
//当点击登录按钮时,切换到另一个页面
protected void login_Click(object sender, EventArgs e)
{
//接受用户输入的为标准小的TextBox
if (in_user_name.Text.Trim() == "" || in_pwd.Text.Trim() == "")
{
this.ClientScript.RegisterStartupScript(this.GetType(),"","<script>alert('没有填写用户名或密码')</script>");
return;
}
//验证码不匹配
if (in_code.Text != code.Text)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('验证码不匹配,请重新填写')</script>");
code.Text = random(4);
return;
}
//是seven账户登录
if (in_user_name.Text == "seven" && in_pwd.Text == "seven")
{
Response.Redirect("Default2.aspx?userName=" + in_user_name.Text + "");
}
else
{
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('用户或密码错误')</script>");
}
}
- this指本.aspx文件页面。ClientScript使用 ClientScript属性获取一个可用于管理脚本、注册脚本和向网页添加脚本的ClientScriptManager对象。ClientScriptManager.RegisterStartupScript方法向Page对象注册启动脚本。
- Response.Redirect将客户端定向到新的URL并指定该新URL。
[4]重定向页面后台代码
[3]中重定向页面为Default2.aspx。设计Default2.aspx页面(写点文字)并编写后台代码。后台(Default2.aspx.cs)代码:
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if (Request.QueryString["username"] != null)
{
content_show.Text = "wellcome:" + Request.QueryString["username"];
content_show2.Text = "Now is:" + DateTime.Now.ToString();
}
else
{
Response.Redirect("Default.aspx");
}
}
}
}
Request.QueryString["username"]得到该页面Default2.aspx的“网址名”。是Default.aspx跳转时传递过来的("Default2.aspx?userName=" + in_user_name.Text +"")。
(3)运行结果
点击登录按钮跳转的页面:
(4)记录登录错误次数
用Session来记录用户登录的错误次数。在用户第一次访问登录页面时定义一个Session对象(Session[“login”]并将其初始化为0。然后每登录一次就使用int.parse()函数将Session[“login”].ToString()转化为数字再增1并重新赋值给Session[“login”]和一个变量,判断变量的值是否超过了登录次数限制来决定重定向到其它网页。
4 Session
用VS2008新建网站项目工程,新建images文件夹用来存放文件,新建Default2.aspx及Default3.aspx。
(1)Session保存信息购物车模拟
[1]页面设计
[2]后台代码
Default.aspx.cs
//第一款Mp3被加入购物车
protected void add_1_Click(object sender, EventArgs e)
{
Session["mp31"] = "Mp3_1,价格:1¥";
if (Session["mp31"] != null)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('成功添加商品到购物车')</script>");
}
}
//第二款Mp3加入购物车
protected void add_2_Click(object sender, EventArgs e)
{
Session["mp32"] = "Mp3_2,价格:2¥";
if (Session["mp32"] != null)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('成功添加商品到购物车')</script>");
}
}
Default2.aspx.cs
//第一款手机被加入到购物车
protected void Button2_add_1_Click(object sender, EventArgs e)
{
Session["phone1"] = "phone_1,价格:3¥";
if (Session["phone1"] != null)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('成功添加商品到购物车')</script>");
}
}
第二款手机被加入到购物车
protected void Button2_add_2_Click(object sender, EventArgs e)
{
Session["phone2"] = "phone_2,价格:5¥";
if (Session["phone2"] != null)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('成功添加商品到购物车')</script>");
}
}
Default3.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Label1.Text = " 您选择的商品如下:" + "<br>";
Label1.Text += Session["mp31"] + "<br>";
Label1.Text += Session["mp32"] + "<br>";
Label1.Text += Session["phone1"] + "<br>";
Label1.Text += Session["phone2"];
Session.Clear();
}
}
[3]运行结果
单这么用Session是不能实现购物车的,如对多次添加某个商品到购物车,购物车里只会有一件这样的商品,这都是Session的特性所致。
(2)Session使用方法
Session提供了一种把信息保存在服务器内存中的方式。他能储存任何数据类型,包含自定义对象。Session保存的数据是跨页面全局型的,可以跨页面访问,每个SessionID中只存储唯一的数据。简单的使用:首先设定session["MP3"]=" MP31",然后你在会话还没结束的情况下,你又设定session["MP3"]=" MP32";这样这个SessionID没变,然而Session池中的数据则被覆盖。此时session["MP31"]的值就是“MP32”,而不是其它。
5 Cookies
Cookies对象用来在客户端保存信息。通常和Response及Request对象联用。Response对象用来向客户端输出信息;Request对象用来读取客户端的信息,如填入表单的数据,保存在客户端的Cookies的信息。
(1)页面设计
RadioButton的GroupName属性要一致才能保证同只有选中的RadioButton.Checked属性为true。
(2)后台代码
页面第一次加载
protected void Page_Load(object sender, EventArgs e)
{
//第一次到此页面
if (!Page.IsPostBack)
{
HttpCookie cookie = new HttpCookie("radio"); //Request.Cookies["radio"];
if (cookie == null)
{
cookie.Values.Add("radio", "红烧肉");
Response.Cookies.Add(cookie);
cookie.Expires = DateTime.Now.AddDays(1);
}
else
{
switch (cookie.Values["radio"])
{
//radioButton's Text
case "红烧肉":
//radiobutton's id
v1.Checked = true;
break;
case "水煮鱼":
v2.Checked = true;
break;
case "地三鲜":
v3.Checked = true;
break;
case "丝瓜炒蛋":
v4.Checked = true;
break;
default:
v4.Checked = true;
break;
}
}
}
}
提交按钮
protected void B_select_Click(object sender, EventArgs e)
{
HttpCookie cookie = new HttpCookie("radio");// Request.Cookies["radio"];
if (v1.Checked)
{
cookie.Values.Set("radio", "红烧肉");
}
if (v2.Checked)
{
cookie.Values.Set("radio", "水煮鱼");
}
if (v3.Checked)
{
cookie.Values.Set("radio", "地三鲜");
}
if (v4.Checked)
{
cookie.Values.Set("radio", "丝瓜炒蛋");
}
Response.Cookies.Add(cookie);
Label1.Text = "用cookie保持的信息为:" + Request.Cookies["radio"].Values[0].ToString();
}
(3)运行结果
当选择另一个RadioButton时,RadioButton的Checked属性状态立即改变,但需要点击两次选择按钮cookie的values[0]值才会被更新到网页上。不知为何。
[2014.07.26- 16.31]
6 使用HtmlImage控件
用VS2008新建网站(ASP .NET)项目,新建images文件夹,添加存在的文件进去。
(1)页面设计
在Default.aspx的设计模式的工具箱中拖入Html中的如上控件(Select, input(Button),image)。在Default.aspx源码模式下都要为每个控件添加runat = “server”属性使其成为服务器控件。编写Show控件的后台代码时,指定的函数:onserverclick = “xxx”。
(2)后台代码
Show按钮的后台代码:
protected void D_show_book(object sender, EventArgs e)
{
image.Src = "images/" + Select1.Value;
}
image为Html下的image控件的id。Select1为Html下的select控件。为select控件下拉中添加选项的代码为:
<select id="Select1" name="D1" runat="server">
<option value="html1.JPG" >《西游记》</option>
<option value="html2.JPG" >《红楼梦》</option>
</select>
7 使用HtmlTable控件创建表格
HtmlTableRow对象用来创建行。HtmlTableCell对象用来创建表格的单元格(如行的列)。
(1)页面设计
将每个Html控件的加上runat=”server”属性。
(2)后台代码
添加命名空间System.Web.UI.HtmlControls:using System.Web.UI.HtmlControls;
protected void show_table(object sender, EventArgs e)
{
int row, col, i, j;
row = Convert.ToInt32(Select1.Value);
col = Convert.ToInt32(Select2.Value);
for (i= 0; i < row; ++i)
{
HtmlTableRow tRow = new HtmlTableRow();
for (j = 0; j < col; ++j)
{
HtmlTableCell tCol = new HtmlTableCell();
tCol.Controls.Add(new LiteralControl("[" + i + "," + j + "]"));
tRow.Cells.Add(tCol);
}
table.Rows.Add(tRow);
table.Visible = true;
}
}
运行结果:
8 选择操作
(1)页面设计
选择DIV的Align属性为center。两个RadioButton的GroupName都为dradio。在大的div内再添加两个位置并列的div,添加的div都设置visible="false"runat="server"两个属性。
(2)后台代码
确认按钮的后台代码:
protected void select_sure_Click(object sender, EventArgs e)
{
if (table.Checked == true)
{
div_table.Visible = true;
div_dary.Visible = false;
}
else if((dary.Checked == true) && (table.Checked == false))
{
div_dary.Visible = true;
div_table.Visible = false;
}
}
运行结果:
9上传文件
用HtmlInput(File)来上传文件(常见格式图片和记事本文件都可以上传)。用VS2008新建网站ASP .NET项目,新建upload文件夹用来存放上传的文件。
(1)页面设计
属Html下的代码都要添加runat=”server”属性使之成为服务器控件。
(2)后台代码
主要利用HtmlInput(File)对象来获取文件的路径、文件名、文件大小及文件类型。上传文件的点击事件响应函数代码:
protected void uploadFileButton_Click(object sender, EventArgs e)
{
if (File1Upload.PostedFile.ContentLength > 0)
{
try
{
string upload = Server.MapPath("upload\\");
int lastIndexOf = File1Upload.PostedFile.FileName.LastIndexOf("\\");
string fileName = File1Upload.PostedFile.FileName.Substring(lastIndexOf + 1);
string uploadPath = upload + fileName;
File1Upload.PostedFile.SaveAs(uploadPath);
show_file_infor.InnerHtml = "源文件位置:" +
File1Upload.PostedFile.FileName +
"<br>文件大小:" + File1Upload.PostedFile.ContentLength + "kb<br>" +
"文件类型:" + File1Upload.PostedFile.ContentType +
"<br>上传文件保存位置:" + uploadPath;
}
catch (Exception ex)
{
show_file_infor.InnerHtml = "ERROR: " + ex.Message.ToString();
}
}
else
{
show_file_infor.InnerHtml = "文件不存在,上传失败";
}
}
运行结果:
[2014.7.27 - 16.57]
10 RadioButtonList
(1)页面设计
选中拖入的RadioButtonList右键,选择其Items属性,在弹出的ListItem对话框中可以添加和删除成员,填写好成员的Text属性。默认一个被选中(用于页面第一次加载时赋值给Label.Text)。
(2)后台代码
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//图片内容默认路径
Image1.ImageUrl = "~/images/html1.JPG";
//Label控件默认值
Label1.Text = RadioButtonList1.SelectedItem.Text;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
if (RadioButtonList1.SelectedIndex > -1)
{
foreach(ListItem rList in RadioButtonList1.Items)
{
Label1.Text = rList.Text;
int intImage = RadioButtonList1.SelectedIndex;
if(intImage == 0)
{
Label1.Text = RadioButtonList1.SelectedItem.Text;
Image1.ImageUrl = "~/images/html1.JPG";
}
else
{
Label1.Text = RadioButtonList1.SelectedItem.Text;
Image1.ImageUrl = "~/images/html2.JPG";
}
}
}
}
11 动态修改字体属性
(1)页面设计
选择DropDownList和CheckBoxList控件的Items属性,在弹出的对话框中添加成员,并默认DropDownListd的某个成员被选中(selected = true)。将RadioButton的GroupName设置相同,让同时只有一个控件被选中,以区别和CheckBox控件的用途。将每个控件的AutoPostBack属性设置为true,这样才能进入控件的事件响应函数。DropDownList和CheckBoxList的事件类型为onselectedindexchanged。
(2)后台编码
在页面设计中双击(也可以在Default.aspx文件中,在每个控件的属性中手动添加每个控件的事件响应函数)每个控件,在Default.aspx.cs文件中会生成控件某事件对应的时间响应函数(以控件id命名)。到对应的函数中编码。
//字体选择响应函数
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
if(DropDownList1.SelectedItem.Text == "大字体")
{
Label1.Font.Size = FontUnit.Larger;
}
else
{
Label1.Font.Size = FontUnit.Smaller;
}
}
//选择粗体CheckBox时的事件响应函数
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
if (CheckBox1.Checked)
{
Label1.Font.Bold = true;
}
else
{
Label1.Font.Bold = false;
}
}
//选择斜体CheckBox的事件响应函数
protected void CheckBox3_CheckedChanged(object sender, EventArgs e)
{
if(CheckBox3.Checked)
{
Label1.Font.Italic = true;
}
else
{
Label1.Font.Italic = false;
}
}
//切换到红色RadioButton被选中
protected void RadioButton1_CheckedChanged(object sender, EventArgs e)
{
if (RadioButton1.Checked)
{
Label1.ForeColor = Color.Red;
}
}
//切换到黄色RadioButton被选中
protected void RadioButton2_CheckedChanged(object sender, EventArgs e)
{
if (RadioButton2.Checked)
{
Label1.ForeColor = Color.Orange;
}
}
//切换到蓝色RadioButton
protected void RadioButton3_CheckedChanged(object sender, EventArgs e)
{
if(RadioButton3.Checked)
{
Label1.ForeColor = Color.Blue;
}
}
//选择下划线和删除线的CheckBoxList
protected void CheckBoxList1_SelectedIndexChanged(object sender, EventArgs e)
{
if (CheckBoxList1.Items[0].Selected)
{
Label1.Font.Underline = true;
}
else
{
Label1.Font.Underline = false;
}
if (CheckBoxList1.Items[1].Selected)
{
Label1.Font.Strikeout = true;
}
else
{
Label1.Font.Strikeout = false;
}
}
运行结果:
必要时,手动设置控件的事件与事件响应函数的对应关系。
12用户注册[使用验证控件]
(1)页面设计
为每个验证控件选择验证对象(ControlToValid),设置其错误消息(ErrorMessage)。为注册账号的文本框的ReqularExpressionValidator的ValidationExpression创建自定义表达式:^[A-Za-z0-9]+$;邮箱文本框的ReqularExpressionValidator的ValidationExpression的值选择“Internet电子邮箱地址”。
(2)后台代码
提交按钮的点击事件响应函数:
//提交按钮点击响应函数
protected void Button1_Click(object sender, EventArgs e)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('恭喜注册成功,您的用户名是:" + TextBox1.Text.ToString() + " ||密码:" + TextBox2.Text.Trim() + " ||邮箱:" + TextBox4.Text + "')</script>" );
}
运行结果:
13 带节日提示日历
(1)页面设计
往Default.aspx的设计模式中的DIV控件中拖入一个Calendar控件,可右键设置各属性。
(2)后台代码
string[][] holidays = new string[13][];
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 0; i < 13; ++i)
{
holidays[i] = new string[32];
}
holidays[1][1] = "元旦";
holidays[2][14] = "情人节";
holidays[3][7] = "女生节";
holidays[4][1] = "愚人节";
holidays[5][1] = "劳动节";
holidays[6][1] = "儿童节";
holidays[7][1] = "建党节";
holidays[8][1] = "建军节";
holidays[9][9] = "重阳节";
holidays[10][10] = "国庆节";
holidays[11][4] = "美好节";
holidays[12][25] = "圣诞";
}
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
if (e.Day.IsOtherMonth)
{
e.Cell.Controls.Clear();
}
else
{
string Hol = holidays[e.Day.Date.Month][e.Day.Date.Day];
if(Hol !=string.Empty)
{
e.Cell.Controls.Add(new LiteralControl("<br> <span Style='color:red;size:2'>" + Hol + "</span>"));
}
}
}
运行结果:
[2014.7.28 - 16.02]
14创建Web用户控件
创建的Web用户控件就是VS2008控件的组合。
以管理员身份打开VS2008,新建 >> 网站 >> ASP .NET。在解决方案资源管理器中选中项目工程名,右键 >> 添加新项 >> Web用户控件,在项目工程下生成WebUserControl.ascx文件(包含其后台文件WebUserControl.ascx.cs)。切换到WebUserControl.ascx文件的设计模式中,往WebUserControl.ascx中拖控件以创建一个用户控件。双击控件的后台代码写在了WebUserControl.ascx.cs中。
15站点导航控件
以管理员身份启动VS2008,新建 >> 网站 >> ASP .NET。为项目新建一个名为movies的文件夹,为此文件夹新建3个Web窗体文件。
(1) SiteMapPath控件
往每个页面的设计模式下添加一个“导航”下的SiteMapPath控件(可选择其套用格式)。
(2)站点地图
右键项目名称>> 添加新项 >> 站点地图,编写Web.sitemap内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="Default.aspx" title="主页" description="主-页">
<siteMapNode url="~/movies/Default.aspx" title="movies首页" description="movies-首页">
<siteMapNode url="~/movies/Default2.aspx" title="movies喜剧" description="movies-喜剧">
<siteMapNode url="~/movies/Default3.aspx" title="movies喜剧周星驰" description="movies喜剧-周星驰">
</siteMapNode>
</siteMapNode>
</siteMapNode>
</siteMapNode>
</siteMap>
<siteMapNode>…</siteMapNode>对标记网页关系,嵌套在某对<siteMapNode>…</siteMapNode>内的网页在SiteMapPath控件中就显示在后面。运行嵌套在最里面的网页看SiteMapPath的内容:
当前网页为Default3.aspx,点击movies喜剧,movies首页,主页会对应的跳转到movies文件下的Default2.aspx,Default.aspx及Default.aspx网页面。
16 母版页
(1)母版设计
以管理员身份启动VS008。新建 >> 网站 >> ASP .NET。在解决方案资源管理器中选中项目工程名,右键 >> 添加新项 >> 母版页。在母版页的设计模式下设计母版页,将母版页的ContentPlaceHolder给留出来给用户用。
编辑TreeView的Node属性会得到TreeView的具体内容。TreeView下的每个内容都可以对应一个图标和对应的网页链接。
(2)添加母版
选中项目名右键 >> 添加新项 >> Web窗体(勾选选择母版页)>>选择母版,确定。
然后再在新建的Web窗体的ContentPlaceHolder中设计属于自己的网页。
17 创建和读取XML文件
(1)创建XML文件
在VS2008的Web文件中新添一个XML文件。编写XML文件内容(XML文件结构)如下:
<?xml version="1.0" encoding="utf-8" ?>
<bookstore>
<book category="CHILDREN">
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
(2)使用XML控件读取XML文件内容
往Default.aspx中拖入一个XML控件。然后切换到Default.aspx的源码模式下,为此XML控件指明XML源文档:“<fieldset><asp:XmlID="Xml1"runat="server"DocumentSource="~/XMLFile.xml"></asp:Xml> </fieldset>”就可以了。运行程序,XML的文件内容就可以再浏览器中显示出来。(没有换行)
18 文件管理
使用文件管理类(File类)需要添加命名空间:using System.IO;。
(1)页面布局
(2)后台代码
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
InitFolderInfor();
}
}
private void InitFolderInfor()
{
string strFileUplodPath = "UpFile";
//如果上传文件夹不存在则自己创建一个
if (!Directory.Exists(Server.MapPath(strFileUplodPath)))
{
Directory.CreateDirectory(Server.MapPath(strFileUplodPath));
}
//虚拟路径转换为物理路径
string strFilePath = Server.MapPath(strFileUplodPath);
//声明文件夹已经使用容量
double iFolderCurrentSize = 0;
//获取文件夹的所有内容
FileInfo[] arrFiles = new DirectoryInfo(strFilePath).GetFiles();
//操作ListBox1控件
ListBox1.Items.Clear();
foreach (FileInfo fi in arrFiles)
{
iFolderCurrentSize += Convert.ToInt32(fi.Length / 1024);
ListBox1.Items.Add(fi.Name);
}
Label2.Text = string.Format("文件已经使用容量:{0}KB", iFolderCurrentSize);
}
//在listBox1中选择发生变化时
protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string strPath = Server.MapPath("UpFile");
string fileName = ListBox1.SelectedValue;
string filePath = strPath + "/" + fileName;
FileInfo info = new FileInfo(filePath);
Label1.Text = string.Format("文件大小:{0}字节<br><br>上传时间:{1}<br>", info.Length, info.CreationTime);
TextBox1.Text = fileName;
TextBox2.Text = fileName;
}
//上传文件按钮
protected void Button1_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
string path = Server.MapPath("UpFile") + "/" + FileUpload1.FileName;
if (!File.Exists(path))
{
FileUpload1.SaveAs(path);
InitFolderInfor();
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('文件上传成功')</scrpt>");
}
}
}
//删除文件LinButton点击响应函数
protected void LinkButton1_Click(object sender, EventArgs e)
{
string strPath = Server.MapPath("UpFile") + "/" + ListBox1.SelectedValue;
try
{
File.Delete(strPath);
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('删除成功')</script>");
InitFolderInfor();
TextBox1.Text = string.Empty;
TextBox2.Text = string.Empty;
}
catch (Exception ex)
{
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert(' "+ex.Message +" ')</script>");
}
}
//点击修改文件名称LinButton按钮
protected void LinkButton2_Click(object sender, EventArgs e)
{
string path = Server.MapPath("UpFile");
string path1 = path + "/" + ListBox1.SelectedValue;
string path2 = path + "/" + TextBox2.Text;
File.Move(path1, path2);
ListItem li = ListBox1.SelectedItem;
li.Text = TextBox1.Text;
li.Value = TextBox1.Text;
TextBox1.Text = string.Empty;
this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('修改成功')</script>");
}
}
运行结果:
19 缓存替换
使用substitution控件。
(1)设置页面缓存时间
在Default.aspx页面的源码模式下加入以下语句:
<%@ OutputCache Duration="5" VaryByParam="none"%>
此语句表示Default.aspx页面的输出每5秒才更新一次。而在Default.aspx中的substitution控件内容则时时更新。
(2)页面设计
页面设计对应的源码(乱,可对应控件拾关键部分):
<body>
<p>
以下时间是使用Substitution控件实现缓存后的替换:</p>
<form id="form1" runat="server">
<p>
<asp:Substitution ID="Substitution1" runat="server" MethodName="getNowTime"/>
</p>
<p>
以下事件显示使用页面输出缓存,缓存的时间为5秒:</p>
<table>
<tr>
<td>
<%=DateTime.Now.ToLongDateString()%>
<%=DateTime.Now.ToLongTimeString() %>
</td>
</tr>
</table>
<p align="left">
<asp:Button ID="Button1" runat="server" Text="刷新页面" />
</p>
</form>
</body><span style="font-size:14px;">
</span>
(3)substitution控件对应的后台代码
public static string getNowTime(HttpContext context)
{
return DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString();
}
运行结果:
Substitution控件中显示的时间时刻更新(间隔一秒),而页面输出则是5秒一次。
[2014.7.30 - 18.06]