[ASP.NET-I] VS2008 ASP.NET网站 页面基础(控件拖拉)练习I

笔记不涉及数据库SQL Server 2008的使用,随意练习一下控件使用(认识页面布局和后台代码)。

 

[VS2008 数据库 IIS网站服务器]

首次启动VS2008时选中Visual C#进行设置。VS2008建立的网站项目拥有微型网站服务器的功能,项目目录就是一个Web站点。当运行VS2008网站项目时,浏览器会运行项目下的Default.aspx文件,将其运行结果显示在浏览器之上。利用VS2008就可以进行网页学习,当需要数据库时可再进行VS2008SQL 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>控件的idInnerHtml<div>的一个内部属性。TextInputBox1是输入框控件的idlanguage="C#"表示用C#语言来编写<scrip>…</script>标记对的代码。这个函数在确定按钮被点击时被调用,查看按钮对应的源码,对按钮设置的事件就是onclick事件,而这个函数就是点击它的事件响应函数。

 

添加事件响应函数后再运行一下这个项目,点击浏览器上的确定按钮后的效果:

编码方式有多种,像后台编码(在Default.aspx.cs文件中编码)和嵌入式编码(在Default.aspx文件中的某个标记对中编码)。

 

2 C#基础

C#基础知识可在VS2008的控制台程序下进行编程练习。

 

(1)C#的诞生

微软为了摆脱java诞生为其带来的困扰,就设计.NET.NET核心语言C#来进军互联网。C#CC++衍生而来,是基于CC++的。如果想要作为一个.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++中可改写的函数用virtualC#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值可以可以产生不同的随机值。
  • RandomNext(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.aspxDefault3.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对象用来在客户端保存信息。通常和ResponseRequest对象联用。Response对象用来向客户端输出信息;Request对象用来读取客户端的信息,如填入表单的数据,保存在客户端的Cookies的信息。

 

(1)页面设计

RadioButtonGroupName属性要一致才能保证同只有选中的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时,RadioButtonChecked属性状态立即改变,但需要点击两次选择按钮cookievalues[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;
}


 

imageHtml下的image控件的idSelect1Html下的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)页面设计

选择DIVAlign属性为center。两个RadioButtonGroupName都为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上传文件

HtmlInputFile)来上传文件(常见格式图片和记事本文件都可以上传)。用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)页面设计

选择DropDownListCheckBoxList控件的Items属性,在弹出的对话框中添加成员,并默认DropDownListd的某个成员被选中(selected = true)。将RadioButtonGroupName设置相同,让同时只有一个控件被选中,以区别和CheckBox控件的用途。将每个控件的AutoPostBack属性设置为true,这样才能进入控件的事件响应函数。DropDownListCheckBoxList的事件类型为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)。为注册账号的文本框的ReqularExpressionValidatorValidationExpression创建自定义表达式:^[A-Za-z0-9]+$;邮箱文本框的ReqularExpressionValidatorValidationExpression的值选择“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中。


切换到Default.aspx的设计模式下,将WebUserControl.ascx直接拖入就可以用创建的Web用户控件了,用户控件的所有子控件都保持着原先的功能,事件响应函数为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中设计属于自己的网页。

[2014.7.29 - 19.57]

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]
笔记源自看视频的实践总结。

WebFNoteI Over.
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值