ASP.NET WEBFORM
Aspx
aspx文件(新建项→Web窗体) 。在aspx中可以使用<%=表达式%>的方式在页面的当前位置输出表达式(表达式至少要用protected级别,后面会讲为什么,如果自动提示出不来,则重新生成项目)或者局部变量,表达式也可以是一个方法、属性、字段。不要忘了写=。
这个文件可以几乎写入任何的C#语句(就像当年的ASP)。
aspx和ashx关系
aspx和ashx关系:aspx就是一个特殊的IHttpHandler ,aspx对应的类是Page,它是实现了IHttpHandler接口,所以可以说aspx是高级的HttpHandler, aspx中帮我们封装了很多操作,我们可以傻瓜化的进行开发。
反编译看:其实=就是相当于Response.Write(),直接写Response.Write()也可以。
ashx(handler),aspx(page)
aspx
Web窗体设计页面。Web窗体页由两部分组成:视觉元素(html、服务器控件和静态文本)和该页的编程逻辑(VS中的设计视图和代码视图可分别看到它们对应得文件)。VS将这两个组成部分分别存储在一个单独的文件中。视觉元素在.aspx 文件中创建。
ashx
ashx文件是主要用来写web handler的。使用.ashx 可以让你专注于编程而不用管相关的web技术。我们熟知的.aspx是要做html控件树解析的,.aspx包含的所有html实际上是一个类,所有的html都是类里面的成员,这个过程在.ashx是不需要的。ashx必须包含IsReusable属性(这个属性代表是否可复用,通常为true),而如果要在ashx文件用使用Session必须实现IRequiresSessionState接口。
aspx、aspx.cs关系
部分类
使用ILSpy或者Reflector等打开dll,反编译这两个类,发现ASPNETTest1.WebForm1是在VS中编写的aspx.cs类,而ASP.webform1_aspx则是一个继承自ASPNETTest1.WebForm1的子类,ASP.webform1_aspx代码是根据aspx内容动态生成的构建网页内容的类。综上,aspx最终也会生成一个类,这个类是继承自aspx.cs中的类。查看反编译以后的代码,可以看到就是编译生成了普通的.Net 代码,代码中在拼接html。因为aspx生成的代码是cs类的子类,所以就明白了为什么“aspx中调用cs的成员级别必须是protected或者public,不能是private的。
轻量级控件
asp.net webform:Button、TextBox、CheckBox、RadioButton、FileUpload、DropDownList、ListBox、Repeater。
Button控件
OnClientClick属性,当用户点击按钮的时候在浏览器端执行的代码,注意OnClientClick是字符串属性,写的代码是JavaScript代码,渲染成onlick,运行在浏览器端。<asp:Button ID="btnDel" runat="server" onclientclick="return confirm('真的要删除吗?')" Text="删除" /> 服务器端的OnClick。
LinkButton
用法和Button差不多,区别就是Button控件渲染为按钮,而LinkButton渲染为超链接。不要用LinkButton来实现普通的超链接:OnClick→Redirect,作死的节奏。 LinkButton真没啥用,除了长得像Button一样。不利于SEO;而且效率低。
FileUpload
WebForm会很“操心”的在form中自动帮我们加上enctype="multipart/form-data"
Repeater
Repeater相当于一个高级的foreach,每一项的显示用ItemTemplate格式去显示。
1 <asp:Repeater ID="Repeater1" runat="server">
2 <ItemTemplate>
3 <tr><td><%#Eval("Name")%></td><td><%#Eval("Age")%></td></tr>
4 </ItemTemplate>
5 </asp:Repeater>
<%=test()%>:当前位置打印出来
<%test()%>:调用test方法
<%#Eval("Id")%>:数据绑定
ViewState
asp.net4.5之后ViewState做了加密处理,无法用ViewState查看器查看了,首先在Web.config的system.web节点下增加<machineKey compatibilityMode="Framework20SP1" />(开发不要这样干,只是为了研究),然后使用ViewStateDecoder2.0查看。
之前讲过HttpHandler是无状态的,aspx是高级的HttpHandler所以同样是无状态的,在aspx.cs中一般也不要用类字段。那么如果确实需要存储一些页面相关的变量怎么办呢?比如点击按钮“点击次数”加一。
什么原理?查看页面的__VIEWSTATE,它是一个隐藏的input。每次页面渲染生成html的时候,asp.net把ViewState中的值进行编码处理序列化为__VIEWSTATE这样一个隐藏字段放到html中,下次再次提交的时候把__VIEWSTATE提交,服务器把__VIEWSTATE反序列化填充到ViewState属性中。其实就是把浏览器端当成“数据暂存”场所。反编译看看Label的Text实现。
除了ViewState属性,还有哪些数据会放到__VIEWSTATE中?所有在cs代码中修改的值,比如给DataSource赋值的,比如Label的Text是没有放到__VIEWSTATE的,但是代码中给Text属性赋值就会被放到__VIEWSTATE中了。所以__VIEWSTATE是用来盛放“本次修改的内容”供“下次请求”还原现场使用,把Http模拟成了有状态。
Repeater的这一堆ViewState,坏处是什么?ViewState是可以被禁用的(页面EnableViewState="false";单控件禁用、单页面禁用、整站禁用),客户端只会保留基本的__VIEWSTATE。
什么时候可以禁用ViewState:当数据不需要“下次”使用的时候(不是只有设置,而是有读取控件的值的时候),就可以禁用
数据出错则把Label设置为红色,需要启用ViewState吗?
数据出错则把Label设置为红色,否则设置为绿色;点击BtnClear,如果Label为红色,则把Label设置为黑色,需要启用ViewState吗?
把数据显示到Repeater中,需要启用ViewState吗?
全站禁用ViewState:system.web下<pages enableViewState="false"/>
先禁用,实在不行再启用。没有非要ViewState才能干成的事
(*)要想完全禁用ViewState要去掉form的runat=server,大部分服务器控件就都用不了了。MVC模式+Repeater。