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。