WebForm框架
- WebForm框架
- WebForm介绍
- WebForm窗体框架
- 事件驱动开发简单应用
- ASP.NET程序开发过程
- 网页生成过程的分析
- 案例
WebForm框架
WebForm是微软推出的一款为了吸引更多的其他开发者能够快速入门到.NET技术中的一个框架,让开发人员感觉使用.NET技术进行BS开发和使用.NET技术进行CS开发一样简单快速。
微软的想法:以后程序员开发网站项目不需要先学习HTML+CSS就能够直接入门BS,因此将HTML标签封装成类似于Winfrom中的控件,然后程序员可以在开发BS项目时使用类似于开发CS项目一样使用“拖控件”的方式快速解决界面问题
但是这个发展途径对于现实开发非常鸡肋,导致只要项目稍微复杂,程序的执行效率很低,目前为止微软自己也逐渐放弃这个框架。
WebForm介绍
- WebForm窗体的后缀名.aspx
- WebForm的组成
- .aspx文件类似于Winform中的设计界面
- .aspx.cs文件类似于Winform中的后台C#类
- .aspx.designer.cs文件类似于Winform中的designer.cs文件
- Web程序中的配置文件默认名为:Web.config文件
CS程序中的配置文件默认名为:App.config文件
WebForm窗体框架
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="ASP.NETWebDemo.index" %>
<!DOCTYPE html>
<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:>标签,这些标签理解为是微软封装好的标签,这些标签是在服务器端执行的标签,而不是发送给浏览器客户端的标签
<!DOCTYPE html>
<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是隐藏域,
隐藏域的作用:
- 帮助表单收集和发送信息,便于后端处理数据。用户点击提交的时候,隐藏域的内容也一并提交给后台,但是用户是不可见的。
- 安全性:后端接收前端发来的数据,要对其身份进行确认,防止外来数据传入后端。通过验证value的值和后端数据库中name的值是否一致,来达到验证的效果。
- 对表单中的按钮添加隐藏域,告诉后端提交的是哪一个按钮。
- 对于网页中有多个表单元素form来说,多个form表单是无法一次提交的,但是表单之间又相互影响,所有通过添加隐藏域来连接表单。
- 隐藏数据:JS不支持全局变量,DNA有时候我们必须使用全局变量,就可以把值先隐藏在隐藏域中,这样值就不会丢失了。
- 对小窗口的弹出与关闭,在IE中不支持小窗口的相互调用,所以只能在其窗口中写一个哪个有,当小窗口可能到隐藏域的时候就会close。
ASP.NET程序开发过程
- 创建网站/Web应用程序–打开开发环境
- 编写页面—设计HTML页面
- 编写后台—使用C#或VB.NET编写后台交互代码
- 调用执行—编译代码并发布
ASP.NET开发中网站和Web应用程序的比较
相同点:
- 两者都可以开发Web项目
- 两者基于事件机制编写程序
不同点:
- Web应用程序在运行阶段不允许修改后台代码,网站在运行时可以随时修改后台代码,前台刷洗即可
- Web应用程序命名空间管理方便,而网站项目命名空间不好区分
一般开发大型项目都使用Web应用程序,目前VS中已经没有网站项目框架了
网页生成过程的分析
- 客户端点击提交按钮或者触发控件的事件
- 服务器端刷新整个页面
- 执行Page_Load事件
- 执行具体控件的事件并给页面控件赋值
- 重新生成新页面的HTML
- 使用Response对象返回包含新数据的html页面
- 浏览器看到刷新的页面
案例
创建一个WebForm页面,需求:页面中实现一个聊天的对话框,当点击按钮将txtBox1中的内容复制到txtBox2中。
public partial class WebDemo1 : System.Web.UI.Page
{
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//这是回发
{
//这里书写回发时处理的工作
}
}