WebForm是微软推出的一款为了吸引更多的其他开发者能够快速入门到.NET技术中的一个框架,让开发人员感觉使用.NET技术进行BS开发和使用.NET技术进行CS开发一样简单快速。
微软的想法:以后程序员开发网站项目不需要先学习HTML+CSS就能够直接入门BS,因此将HTML标签封装成类似于Winfrom中的控件,然后程序员可以在开发BS项目时使用类似于开发CS项目一样使用“拖控件”的方式快速解决界面问题
但是这个发展途径对于现实开发非常鸡肋,导致只要项目稍微复杂,程序的执行效率很低,目前为止微软自己也逐渐放弃这个框架。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="ASP.NETWebDemo.index" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>title>
head>
<body>
<form id="form1" runat="server">
<div>
div>
form>
body>
html>
@page指令:每个aspx页面只能有一个@page指令,@page指令是关联后台的CS文件
html标签:指的是这个aspx页面的设计区域类似于普通的HTML文件,只不过这些标签中多了一个属性runat=“server”。
标签原本应该运行在客户端浏览器中,而带有这个属性的标签全都是运行在服务器上的标签。
微软重点就是使用这个属性将HTML标签转成服务器标签
Webform中自动携带一个form表单,并且这个form表单的runat属性已经被默认设置,而且form表单中嵌套了一个div标签,其目的就是希望我们设计页面时将所有的标签全部在这个form表单中去设计,这样当这个表单在服务器中运行时,其内部的所有标签也会在服务器中运行
使用Web窗体和使用Winform窗体开发方式非常相似
使用“控件+事件”方式实现计算器
拖出来的控件不是普通的HTML标签,而是< asp:>标签,这些标签理解为是微软封装好的标签,这些标签是在服务器端执行的标签,而不是发送给浏览器客户端的标签
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>title>
head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="num1" runat="server">asp:TextBox>
+<asp:TextBox ID="num2" runat="server">asp:TextBox>
=<asp:TextBox ID="num3" runat="server">asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="计算" />
div>
form>
body>
html>
经过对比:在浏览器的页面中显示的标签依然是普通的html标签,可以理解为微软内部将HTML标签封装称为控件标签
在客户端中多了一些input标签,而且类型是“hidden”,这些hidden是隐藏域
隐藏域的作用:
相同点:
1.两者都可以开发Web项目
2.两者基于事件机制编写程序
不同点:
1.Web应用程序在运行阶段不允许修改后台代码,网站在运行时可以随时修改后台代码,前台刷洗即可
2.Web应用程序命名空间管理方便,而网站项目命名空间不好区分
一般开发大型项目都使用Web应用程序,目前VS中已经没有网站项目框架了
网页生成过程的分析
1.客户端点击提交按钮或者触发控件的事件
2. 服务器端刷新整个页面
3. 执行Page_Load事件
4. 执行具体控件的事件并给页面控件赋值
5. 重新生成新页面的HTML
6. 使用Response对象返回包含新数据的html页面
7. 浏览器看到刷新的页面
案例
创建一个WebForm页面,需求:页面中实现一个聊天的对话框,当点击按钮将txtBox1中的内容复制到txtBox2中。
{
protected void Page_Load(object sender, EventArgs e)
{
txtBox1.Text = "请输入内容";
}
protected void btnRecive_Click(object sender, EventArgs e)
{
txtBox2.Text = txtBox1.Text;
}
}
然而执行效果并非如此
从执行过程中发现,只要页面中访问的服务器文件还是当前页面那么,每次都会从这个页面的Page_Load事件开始,也可以理解为,Web项目中的文件每次都是新的开始。原因是因为代码是服务器代码和CS中的完全不一样。
服务器中的文件:因为不确定到底是哪个客户端进行访问的所以将每次访问都当做第一次访问,因此每次的访问都是从Load事件开始。
因此服务器才不管你这个请求到底是第一次打开连接的请求,还是点击页面中按钮发送过来的请求,服务器都会给你从Load事件开始。
解决方案:
要是能够搞清楚到底这次请求是通过URL地址第一次请求,还是点击页面中的请求按钮触发的请求就能解决
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)//首次加载IsPostBack为false
{
txtBox1.Text = "请输入内容";
}
else//这是回发
{
//这里书写回发时处理的工作
}
}