MVC框架越来越流行,现在大部分公司都在使用或转向MVC框架开发Web(指.net平台),尤其微软又新发布了MVC5.0版、WebApi2,老的WebForm框架被人诟病的越来越多,网上大量的
WebForm和MVC优缺点比对的文章,MVC类的学习教程,总结起来有几点:
1、微软对
WebForm的更新越来越少,对MVC版本的更新近来很快,有抛弃
WebForm的意思;现在大部分公司招聘Web开发,都有标注:熟悉MVC框架、思想等;
2、
WebForm有以下缺点:
(1)http的无状态性,微软对开发者屏蔽了这一过程,提供开发效率高的常用控件,降低了开发者的入门难度,简单的拖拉控件就可以快速构建一个丰富的网页,使得程序员不在去关注http、html、底层实现等;
(2)页面和控件都有自己的生命周期,执行事件或触发操作会造成页面回发,大量数据往返服务器,为保存这些控件的状态,使用隐藏域保存数据,降低了页面响应性能;
(3)很多控件生成的html代码不规范;
(4)视图文件和代码文件关注点不分离,耦合度高,不易做测试;不易利用各种测试工具;
(5)页面控制不灵活;
(6)异步请求后台需要对应一个一般处理程序;
(7)不符合现在web开发模式,mvc把url请求交给控制器,webform把请求交给pageLoad;
(8)复杂的生命周期和各种控件的封装,入门容易提升很难;
3、优点
丰富的控件,基于事件模型,使用者只需要在对应的事件下实现操作,可以快速构建原型;
入门容易;大部分控件使用上相似,降低了难度;
最近在维护公司以前
WebForm开发的老的项目,过程中遇到一些问题,随时记录和查资料,现总结如下:
1、页面输出
<% %> 只能包含语句;
<%# %> 只有服务器端控件才能使用,用于数据绑定;
<%= %> 只能包含表达式,简单数据绑定;
<%$%>主要对web.config文件键值对进行绑定,通常用于连接字符串;
<%@ %>用来导入后台命名空间;
<%# %> 只有服务器端控件才能使用,用于数据绑定;
<%= %> 只能包含表达式,简单数据绑定;
<%$%>主要对web.config文件键值对进行绑定,通常用于连接字符串;
<%@ %>用来导入后台命名空间;
严格说来,页面中的纯文本会被作为一个Literal控件处理,一段连续的纯文本作为一个Literal控件。在输出时,Literal控件的Render方法会将纯文本输出至HtmlTextWriter中。其效果就等同于writer.Write(...)方式的纯文本输出。以下两种方式的区别:
<%= "Hello World" %> 直接使用页面上的HtmlTextWrite对象输出
<% Response.Write("Hello World"); %> 直接向Response.output输出内容
<% Response.Write("Hello World"); %> 直接向Response.output输出内容
2、注入脚本的方式
(1)使用Literal控件在页面的任意位置注册脚本;
(2)使用Response.Write()在页面的顶部注册脚本;
(3)使用ClientScript.RegisterClientScriptBlock()或者ClientScript.RegisterStartupScript()分别在表单开始和结束的地方注册脚本;如果页面上有一些处理控件的JavaScript,应该使用RegisterStartupScript;
(2)使用Response.Write()在页面的顶部注册脚本;
(3)使用ClientScript.RegisterClientScriptBlock()或者ClientScript.RegisterStartupScript()分别在表单开始和结束的地方注册脚本;如果页面上有一些处理控件的JavaScript,应该使用RegisterStartupScript;
(4)后台拼接好通过全局变量输出到页面,可以输出到页面任意位置; 使用Page.ClientScript.RegisterClientScriptInclude(引用.js文件);
3、三个基本对象
Application:应用程序共享,即是多个用户共享同一个对象,所以处理它时需要加锁;
Session:一个用户具有唯一的SessionID;
ViewState:在一个页面中有效,即是页面一旦提交到server,对象保存的数据全部被清空,注意在服务器提交前有效;
Session:一个用户具有唯一的SessionID;
ViewState:在一个页面中有效,即是页面一旦提交到server,对象保存的数据全部被清空,注意在服务器提交前有效;
4、页面回发
true表示回发,页面中各个控件的值回传到web服务器上,引发相应的事件,处理完后假如无跳转指令,该页面将再次跳转到客户端;若不回发,则需要等到服务器端控件请求时比如onclick操作才回发。客户端可以多次暂存事件。
5、global.asax文件
默认有五个事件主要针对application和session对象,还有一个针对应用程序error处理的;
Application:start 、end事件 跟应用程序有关系的处理,比如:统计站点访问人数
Session:Start、end事件,跟具体用户有关系的,比如:统计当前访问人数
Error:未处理的异常信息处理
Application:start 、end事件 跟应用程序有关系的处理,比如:统计站点访问人数
Session:Start、end事件,跟具体用户有关系的,比如:统计当前访问人数
Error:未处理的异常信息处理
6、web.configw文件
(1)<ConnectionStrings>配置连接数据库的字符串;
(2)<CustomErrors> 配置错误处理;
(3)<Trace>配置启用应用程序跟踪记录;
(4)<authontication> 身份验证
(5)该文件除处理系统默认配置节点外,可以添加自定义配置节,必须在<configsection>下的第一个子配置节,由<section>申明
7、用户控件(页面共享、模板、类似于mvc中的子视图)
(1)用户控件不能直接在浏览器里打开,需要aspx页面承载
在aspx页面上注册一个用户控件
<% @ Register Src="~/DesktopModules/SegmentProject/SegmentData/SegmentProjectDetail.ascx"
TagName="SegmentProjectDetail" TagPrefix ="uc1" %>
用到的地方调用: <uc1 :SegmentProjectDetail runat="server" />
(2)页面注册指令Register
<%@ Register tagprefix="tagprefix" Namespace="namespace" Assembly="assembly" %>
<%@ Register tagprefix="tagprefix" Tagname="tagname" Src="pathname" %>
tagprefix:标签前缀,与命名空间关联的别名
TagName:与类关联的别名
Src:与tagprefix、TagName对关联的声明性用户控件所在的相对路径或绝对路径
Assembly:与tagprefix所关联的命名空间所驻留的程序集,程序集的名称不包含文件扩展名
Namespace:与tagprefix关联的命名空间
<%@ Register tagprefix="tagprefix" Namespace="namespace" Assembly="assembly" %>
<%@ Register tagprefix="tagprefix" Tagname="tagname" Src="pathname" %>
tagprefix:标签前缀,与命名空间关联的别名
TagName:与类关联的别名
Src:与tagprefix、TagName对关联的声明性用户控件所在的相对路径或绝对路径
Assembly:与tagprefix所关联的命名空间所驻留的程序集,程序集的名称不包含文件扩展名
Namespace:与tagprefix关联的命名空间
8、ViewState
Web的无状态性,客户端提交请求给服务器,server给与响应,会重新创建Response对象,页面和其上的控件数据都会被刷掉,ms使用ViewState 一个hidden的隐藏域用于保存页面和数据,需要时在还原回来
(1)、viewstate只在客户端向server提交前有效;
(2)、ViewState把数据报错到隐藏域并输出到客户端页面,这会增加页面html代码的输出量,耗费带宽,不安全性等;
(1)、viewstate只在客户端向server提交前有效;
(2)、ViewState把数据报错到隐藏域并输出到客户端页面,这会增加页面html代码的输出量,耗费带宽,不安全性等;
9、服务器端控件和客户端控件(input标签)
(1)比客户端控件多一些服务器端属性,用于当触发时提交到服务器端,传递方法名;
(2)简单的功能实现可以使用html控件,这样可以减少服务器端负担,提高效率,服务器端控件最终也会被解释成html控件且用额外的方法来保存这些控件的状态和属性,被称为状态管理,以确保在刷新之后还能记录之前的信息;
服务器端控件和客户端控件差别不大,最终都会解释成html,客户端控件加上runnat="server"即指定为服务器端控件;比如<asp:Button ID="btn" OnClick="btn_Click" OnClientClick="return Test();"/> OnClientClick方法的执行要早于服务器端方法OnClick,一般的用js进行数据验证,在提交到服务器端,Test()方法返回类型为布尔值
10、html表单和服务器端表单
(1)、表单用于提交数据,html表单有action和method两个重要的属性,上传附件时需要加一个entype属性;
也可以用Reques[""]获取参数
(2)、服务器端表单多两个属性,runnat=“server”,id,可以不指定method属性默认由当前页处理,post方式提交,一个页面只能有一个服务器端表单,它必须放在form 服务器表单下;
11、数据绑定控件
简单数据绑定:AccessDataSource、ObjectDataSource、SqlDataSource、XmlDataSourcw、SiteMapDataSource
可视化操作即可绑定数据源;
复杂数据绑定:Repeat、DataList、GridView
GridView万能的数据绑定控件,页面上展示表格、列表等都可以实现功能,丰富的事件,但会生成大量的html代码和ViewState数据;Repeat专门用于绑定表格或列表,对样式布局要求不高的;DataList用于绑定列表;ListView 也比较常用