笔记不涉及数据库SQL Server 2008的使用,随意练习一下控件使用(认识页面布局和后台代码)。
首次启动VS2008时选中Visual C#进行设置。VS2008建立的网站项目拥有微型网站服务器的功能,项目目录就是一个Web站点。当运行VS2008网站项目时,浏览器会运行项目下的Default.aspx文件,将其运行结果显示在浏览器之上。利用VS2008就可以进行网页学习,当需要数据库时可再进行VS2008与SQL Server 2008的配置,当要提供他人访问网站功能时再进行ISS与二者的配置。[个人理解]
网页由界面元素及逻辑代码组成。界面元素指网页界面上的控件(如文本输入框,按钮),逻辑代码指当点击诸如按钮后会调用的代码。像按钮这样的控件,都会有一个事件响应函数。
用管理员身份打开VS2008,文件 >>新建 >>网站 >> ASP .NET网站,选择网站项目目录(Web站点目录)。
打开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>
当运行项目时,在浏览器之上可以呈现刚拖入的控件和文字,但点击确定按钮时什么也不会发生(本来什么也没做)。如果要想在点击确定按钮后发生点什么,那就需要为按钮设置一个事件和此事件对应的响应函数。
在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文件中的某个标记对中编码)。
C#基础知识可在VS2008的控制台程序下进行编程练习。
微软为了摆脱java诞生为其带来的困扰,就设计.NET和.NET核心语言C#来进军互联网。C#由C和C++衍生而来,是基于C和C++的。如果想要作为一个.NET专业开发人员,不但要掌握.NET的基础知识还要掌握.NET的专用技术。
一个控制台的C#程序结构:
引入命名空间(using)、在命名空间内(namespace)定义(继承)类和,然后在命名空间的Main()函数中调用这些类。
C#中多了一个foreach,用法跟linux bash脚本中的for用法相似。其余语法跟C一致。
C#的结构体由数据成员和函数成员两部分构成。可以用public等关键字声明成员访问属性。创建结构体对象时用new。非指针结构体变量访问结构体成员跟C一样。
C#类跟C++类的使用思想一致。C++中可改写的函数用virtual,C#用override。构造函数跟C++一致,跟类同名且可重载。也具有相同的继承方式。[对C++的了解很表面,所以C#和C++面向对象的比较也是个人浅层次的]
用VS2008新建一个Web网站项目。在解决方案资源管理器中选中项目,文件 >>新建 >> Web窗体,这样就会默认创建Default2.aspx,勾选将代码放在单独的文件中,这样就会再新建其后台文件Default2.aspx.cs。选中项目,右键新建名为images的文件夹,往此文件夹内添加一张图片。
将登录界面控件放在Default.aspx文件的设计模式中。
在Default.aspx设计模式中双击“看不清楚”,“登录”按钮,会在Default.aspx.cs中生成对应的按钮点击事件响应函数。
//自定义随机返回字符串函数 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; }
//如果是第一次访问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); }
//当点击登录按钮时,切换到另一个页面 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>"); } }
[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 +"")。
点击登录按钮跳转的页面:
用Session来记录用户登录的错误次数。在用户第一次访问登录页面时定义一个Session对象(Session[“login”]并将其初始化为0。然后每登录一次就使用int.parse()函数将Session[“login”].ToString()转化为数字再增1并重新赋值给Session[“login”]和一个变量,判断变量的值是否超过了登录次数限制来决定重定向到其它网页。
用VS2008新建网站项目工程,新建images文件夹用来存放文件,新建Default2.aspx及Default3.aspx。
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(); } }
单这么用Session是不能实现购物车的,如对多次添加某个商品到购物车,购物车里只会有一件这样的商品,这都是Session的特性所致。
Session提供了一种把信息保存在服务器内存中的方式。他能储存任何数据类型,包含自定义对象。Session保存的数据是跨页面全局型的,可以跨页面访问,每个SessionID中只存储唯一的数据。简单的使用:首先设定session["MP3"]=" MP31",然后你在会话还没结束的情况下,你又设定session["MP3"]=" MP32";这样这个SessionID没变,然而Session池中的数据则被覆盖。此时session["MP31"]的值就是“MP32”,而不是其它。
Cookies对象用来在客户端保存信息。通常和Response及Request对象联用。Response对象用来向客户端输出信息;Request对象用来读取客户端的信息,如填入表单的数据,保存在客户端的Cookies的信息。
RadioButton的GroupName属性要一致才能保证同只有选中的RadioButton.Checked属性为true。
页面第一次加载
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(); }
当选择另一个RadioButton时,RadioButton的Checked属性状态立即改变,但需要点击两次选择按钮cookie的values[0]值才会被更新到网页上。不知为何。
[2014.07.26- 16.31]
用VS2008新建网站(ASP .NET)项目,新建images文件夹,添加存在的文件进去。
在Default.aspx的设计模式的工具箱中拖入Html中的如上控件(Select, input(Button),image)。在Default.aspx源码模式下都要为每个控件添加runat = “server”属性使其成为服务器控件。编写Show控件的后台代码时,指定的函数:onserverclick = “xxx”。
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>
HtmlTableRow对象用来创建行。HtmlTableCell对象用来创建表格的单元格(如行的列)。
将每个Html控件的加上runat=”server”属性。
添加命名空间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; } }
运行结果:
选择DIV的Align属性为center。两个RadioButton的GroupName都为dradio。在大的div内再添加两个位置并列的div,添加的div都设置visible="false"runat="server"两个属性。
确认按钮的后台代码:
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; } }
运行结果:
用HtmlInput(File)来上传文件(常见格式图片和记事本文件都可以上传)。用VS2008新建网站ASP .NET项目,新建upload文件夹用来存放上传的文件。
属Html下的代码都要添加runat=”server”属性使之成为服务器控件。
主要利用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]
选中拖入的RadioButtonList右键,选择其Items属性,在弹出的ListItem对话框中可以添加和删除成员,填写好成员的Text属性。默认一个被选中(用于页面第一次加载时赋值给Label.Text)。
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"; } } } }
选择DropDownList和CheckBoxList控件的Items属性,在弹出的对话框中添加成员,并默认DropDownListd的某个成员被选中(selected = true)。将RadioButton的GroupName设置相同,让同时只有一个控件被选中,以区别和CheckBox控件的用途。将每个控件的AutoPostBack属性设置为true,这样才能进入控件的事件响应函数。DropDownList和CheckBoxList的事件类型为onselectedindexchanged。
在页面设计中双击(也可以在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; } }
运行结果:
必要时,手动设置控件的事件与事件响应函数的对应关系。
为每个验证控件选择验证对象(ControlToValid),设置其错误消息(ErrorMessage)。为注册账号的文本框的ReqularExpressionValidator的ValidationExpression创建自定义表达式:^[A-Za-z0-9]+$;邮箱文本框的ReqularExpressionValidator的ValidationExpression的值选择“Internet电子邮箱地址”。
提交按钮的点击事件响应函数:
//提交按钮点击响应函数 protected void Button1_Click(object sender, EventArgs e) { this.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('恭喜注册成功,您的用户名是:" + TextBox1.Text.ToString() + " ||密码:" + TextBox2.Text.Trim() + " ||邮箱:" + TextBox4.Text + "')</script>" ); }
运行结果:
往Default.aspx的设计模式中的DIV控件中拖入一个Calendar控件,可右键设置各属性。
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]
创建的Web用户控件就是VS2008控件的组合。
以管理员身份打开VS2008,新建 >> 网站 >> ASP .NET。在解决方案资源管理器中选中项目工程名,右键 >> 添加新项 >> Web用户控件,在项目工程下生成WebUserControl.ascx文件(包含其后台文件WebUserControl.ascx.cs)。切换到WebUserControl.ascx文件的设计模式中,往WebUserControl.ascx中拖控件以创建一个用户控件。双击控件的后台代码写在了WebUserControl.ascx.cs中。
以管理员身份启动VS2008,新建 >> 网站 >> ASP .NET。为项目新建一个名为movies的文件夹,为此文件夹新建3个Web窗体文件。
往每个页面的设计模式下添加一个“导航”下的SiteMapPath控件(可选择其套用格式)。
右键项目名称>> 添加新项 >> 站点地图,编写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网页面。
以管理员身份启动VS008。新建 >> 网站 >> ASP .NET。在解决方案资源管理器中选中项目工程名,右键 >> 添加新项 >> 母版页。在母版页的设计模式下设计母版页,将母版页的ContentPlaceHolder给留出来给用户用。
编辑TreeView的Node属性会得到TreeView的具体内容。TreeView下的每个内容都可以对应一个图标和对应的网页链接。
选中项目名右键 >> 添加新项 >> Web窗体(勾选选择母版页)>>选择母版,确定。
然后再在新建的Web窗体的ContentPlaceHolder中设计属于自己的网页。
在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>
往Default.aspx中拖入一个XML控件。然后切换到Default.aspx的源码模式下,为此XML控件指明XML源文档:“<fieldset><asp:XmlID="Xml1"runat="server"DocumentSource="~/XMLFile.xml"></asp:Xml> </fieldset>”就可以了。运行程序,XML的文件内容就可以再浏览器中显示出来。(没有换行)
使用文件管理类(File类)需要添加命名空间:using System.IO;。
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>"); } }
运行结果:
使用substitution控件。
在Default.aspx页面的源码模式下加入以下语句:
<%@ OutputCache Duration="5" VaryByParam="none"%>
此语句表示Default.aspx页面的输出每5秒才更新一次。而在Default.aspx中的substitution控件内容则时时更新。
页面设计对应的源码(乱,可对应控件拾关键部分):
<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>
public static string getNowTime(HttpContext context) { return DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString(); }
运行结果:
Substitution控件中显示的时间时刻更新(间隔一秒),而页面输出则是5秒一次。
[2014.7.30 - 18.06]