第一章: 1.代碼后置(CodeBehind)好處:代碼和頁面內容分離,使代碼更清晰 2.控件的可拖移:選中控件-->菜單-->布局-->位置-->絕對定位 3.打開"服務器資源管理器":視圖-->服務資源管理器 (可以連接數據庫) 4.有分頁功能的數據展示控件:GridView、DetailView 作添加功能時,如果直接連數據庫,拉入DetailView 要更改屬性DefaultMode為Insert 5.放在App_Code中的文件是全局文件 6.控件的AutoPostBack屬性在使用DropDownList控件如果需要數據隨下拉框的值更改時改變時,需要將此屬性設置成true 第二章: 1.數據傳遞 (1): get獲取:Request.QueryString["paraName"] (2): post獲取:Request.Form["paraName"] 1: 在一般情況下本頁面post到本頁面[回傳] 判斷是首次加載還是回傳-----IsPostBack if(!IsPostBack)...頁面第一次加載時,執行if里面的代碼 2: 跨頁跳轉 2.1: Button -- PostBackUrl[Click事件不會執行] 跨服務器,相似於Click事件中Response.Redirect(url) 2.2: Server.Excute 不轉移控制權, 本頁面顯示 Url重定向(不跳轉到別的頁面) 2.3: Server.Transfer 轉移了控制權, 本頁面不顯示(Server.Transfer) 備注: .NET已經對get,post進行了封裝 2.狀態保持 (1): Session: Session["UserData"] --> Session["UserData_SessionID"] Clear() --> 清空Session,不改變SessionID Abandon() --> 清空Session,改變SessionID,結束當前會話,所有信息消失 (2): Application 定義在全局應用程序類[Global.asax]中的Application_Start (3): Cookie:只能保存文本,可以序列化成xml保存 Response.Cookies[Cookie名稱].Value=變量值; 在客戶端寫入Cookie string 變量名=Request.Cookies[Cookie 名稱].Value; 讀取客戶端Cookie HttpCookie hcCookie=new HttpCookie(Cookie名稱,值); //新添加一個Cookie hcCookie.Expires=DateTime.Now.AddYears(1); //新建Cookie 在本機上的保存時間為1年 Response.Cookie.Add(hcCookie); (4): ViewState 頁面級別的狀態保存--object 序列化---遠程傳輸 缺點:性能低,不安全,一般不用 (5): 用隱藏控件 HiddenField---string (6): 數據庫 (7): 文件 (8): 緩存 3.Server A: MapPath -- 得到的是物理路徑 應用: 保存文件時一定需要一個完整的物理路徑 例如: 網站根目錄: D://MySchool 代碼: Server.MapPath("~/upFile/ziliao.txt") 返回路徑:D://MySchool/upFile/ziliao.txt 4.頁面執行順序 (1):Page_Load (2):驗證事件 (3):服務器控件事件 如Button_ click (4):Render html生成事件 //在所有事件執行完畢后再執行該事件 protected override void OnPreRender(EventArgs e) {} 5.獲得客戶IP地址:Request.UserHostAddress; 獲取當前瀏覽器版本信息:Request.ServerVariables["HTP_USER_AGENT"] 獲取當前客戶瀏覽器使用語言:Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"] 6.頁面之間的數據傳遞: protected void Page_Load(object sender, EventArgs e) { if(Page.PreviousPage != null)//當判斷時,又會跳轉的源頁面,執行源頁面的代碼 if(PreviousPage.IsCrossPagePostBack) this.lblShowURL.Text="您的查詢條件為:"+((TextBox)this.PreviousPage.FindControl("txtKeyWord").Text; }//一般不用這種方法,而用 if(Request.Form["txtKeyWord"] != null) this.lblShowURL.Text="您的查詢條件為:"+Request.Form["txtKeyWord"]; 第三章: 1.服務器控件 AutoPostBack 自動回發 如果一個對象有 runat="server" 則其是服務器控件 服務器控件必須放在服務器form中,一個頁面只能有這一個表單 2.在后置代碼中隱藏HTML服務器控件:this.divHead.Style.Add("display","one"); 3.讓按鈕不作驗證:設置按鈕的CausesValidation為false 4.ValidationGroup 可使不同的控件在不同的組中,各自不受其它控件事件的影響 5.動態改變母版頁 前提條件:所有ContentPlaceHolderID一致 this.MasterPageFile="~/母版.master"; 6.隱藏母版頁中ID=loginOrRegister的控件 this.Master.FindControl("loginOrRegister").Visible = false; 內容頁給母版頁的文本框賦值: if(this.Master != null) TextBox txt=this.Master.FindControl("TextBox1") as TextBox; if(txt != null) txt.Text=this.TextBox1.Text; 7.ServerCtrl.ClientID document.getElementById("<%=this.TextBox1.ClientID%>").Value;//給子頁面名稱為TextBox1的文本框賦值 第四章: 1: 三層,工廠模式[反射] 抽象工廠 反射[spring]: 工廠,策略,provider 抽象工廠和反射細節區別 A: DALFactory B: 配置文件 appSettings-->name=dalType value=RoleRightSys.SqlServerDAL (1):value必須是程序集名稱[不包括擴展名] (2):程序集項目中的程序集名稱和默認命名空間要相等 (3):將生成的程序集反射成對象 public static T CreateOjectDal<T>(string className) { string path = DBType; className = path + "." + className; return (T)Assembly.Load(path).CreateInstance(className); //找程序集-->實例化類--> 轉為父類 } 例如:DBType=RoleRightSys.SqlServerDAL className=RoleInfoDal T=IRoleInfo 最終:className=RoleRightSys.SqlServerDAL.RoleInfoDal 1):Assembly.Load(path) 加載path指定的程序集 錯誤: 程序集找不到 ----->工廠項目和path指定的項目不再同一目錄 程序集名稱錯誤 ----->查看項目的屬性-->程序集名稱 2):CreateInstance(className)---實例化對象 錯誤: 命名空間或類名不匹配, 區分大小寫 3):確保實例化對象繼承了T所指定的接口 程序集:.exe[控制台應用程序,window應用程序]或.dll[類庫] 用反射實現的優點: A: 代碼簡捷 一個類 一個方法 B: 擴展性更好[功能擴展:多一個接口, 支持擴展:多一個數據庫] 2: xml操作[基礎] A: xml的序列化 1):更加簡單地替換IO操作 2):結合WebService工作 3):配合Ajax工作 要求 1):被序列化的類必須用public修飾 2):被序列化的類必須有默認的構造函數 3):被序列化的相關類也必須滿足1),2)條件 使用場合 1):單純為了數據持久化 2):為了實現依賴緩存 缺點:不能按需求完成層次結構 3.頁面中輸出客戶端腳本(JavaScript) this.Page.ClientScript.RegisterStartupScript(this.GetType(),"","<script>alert('請填寫用戶名!')</script>"); 第五章: 1.調用腳本: this.ltMain.Text="<script>alert('注冊成功!');window.location='default.aspx'</script>"; 2: 光棒效果: 訂閱RowDataBound事件,行數據綁定后觸發 protected void gvBooks_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Attributes.Add("onmouseover", "currentcolor=this.style.backgroundColor;this.style.backgroundColor='#6699ff'"); e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=currentcolor"); } } 3: 全選 3.1: 添加自定列 TemplateField 3.2: 編輯自定義列 3.2.1: HeaderTemplate html-->checkbox 3.2.2: ItemTemplate 服務器checkbox 3.3 html-->checkbox 的 onclick 事件 4: 類型修改 protected void btnModify_Click(object sender, EventArgs e) { StringBuilder ids = new StringBuilder(); foreach (GridViewRow row in this.gvBooks.Rows)//遍歷整個GridView行 { CheckBox ck = row.FindControl("ckItem") as CheckBox; if (ck != null && ck.Checked) { ids.Append(gvBooks.DataKeys[row.RowIndex].Value.ToString() + ",");//必須設置 GridView的屬性 --> DataKeyNames為Id (bookid) } } if (ids.Length != 0) { string strIds = ids.ToString(); strIds = strIds.Substring(0, strIds.Length - 1); BookManager.ModifyCatagory(strIds, ddlTypeName.SelectedValue.ToString()); this.gvBooks.DataBind(); } } 更新sql為update book set CategoryID=1 where bookid in (1,2,3,4,5) 5: 如果要Html標簽正確顯示效果:設置: 數據項的 HtmlEncode =false 6.Eval 和Bind方法的區別: Eval 為只讀的方法,而Bind方法會將值回傳到服務器 Eval重載方法:<%# Eval("PublishDate","{0:dd/MM/yyyy}")%> //0代表對應的PublishDate字段,dd/MM/yyyy為文本的顯示格式 Bind既能從服務器獲取值又能回傳值到服務器 第六章: 1.數據驗證控件: (1).RequiredFieldValidator:非空驗證 display屬性設置為Dynamic可動態該變(如果一個文本框有兩個驗證,如果一個驗證沒有顯示,則會隱藏,不會 占用存在的空間) (2)CompareValidator:是否符合要求(比較值) (如果用戶輸入為空,則不進行驗證) ControlToValidate 要驗證的控件 ControlToCompare 要來與要驗證控件進行比較的控件的ID Operator 設置要比較的運算符 例:要比較輸入是否為日期類型,需移除ValueToCompare和ControlToCompare的值,設置Type類型為Date,設置Operator值為DataTypeCheck (3)RangeValidator:范圍檢查 ControlToValidate 要驗證的控件 MaximumValue 最大值(包括最大值) MinimumValue 最小值(包括最小值) Type 驗證類型 (4)RegularExpressionValidator:正則表達式驗證 中文字符的正則表達式:[\u4e00-\u9fa5] 貨幣(正數或負數):(-)?\d+(\.\d\d)? (5)CustomValidator:自定義驗證控件 ControlTovalidate 要驗證的控件的ID ClientValidationFunction 用於設置客戶端驗證的腳本函數 (6)ValidationSummary:匯總所有的錯誤報告 ShowMessageBox 是否顯示彈出的提示消息 ShowSummary 是否顯示該報告內容(一般為false) 2.Page.IsValid:所有驗證是否都通過 3.<asp:Literal id="ltMain" runat ="server"></asp:Literal>:簡化Label控件,用它生成的HTML代碼不包含任何自動生成的HTML元素 一般在彈出腳本信息的時候用到 如:this.ltMain.Text="<script>alert('注冊成功!')</script>"; 4.圖片上傳: protected void dvBookList_ItemUpdated(object sender,DetailsViewupdatedArgs e) { FileUpLoad fulBook=this.dbBookList.FindControl("fulBook") as FileUpload; Image imgBook=this.dvBookLIst.FindControl("imgBook") as Image; string fileName=fulBook.FileName; if(fileName.Trim().Length !=0) { string strPath=Server.MapPath(imgBook.ImageUrl); fulBook.PostedFile.SaveAs(strPath);//覆蓋原來路徑中圖片 } } 5 .MultiView:可以作下一步的功能 例:mvOne.ActiveViewIndex=0;mvOne.ActiveViewIndex++;mvOne.ActiveViewIndex - -; 6.ImageMap:可在一張圖片上制造多個連接 例: <div> <asp:ImageMap ID="imgmap" runat="server" HotSpotMode="Navigate" ImageUrl="~/Images/模型.JPG" OnClick="imgmap_Click"> <asp:RectangleHotSpot Bottom=267 Right=150 AlternateText="User" NavigateUrl="~/FileUpload.aspx" Target="_blank" HotSpotMode="PostBack" PostBackValue="User" /> <asp:RectangleHotSpot Bottom=267 Left=151 Right=318 AlternateText="UserState" NavigateUrl="~/Calendar.aspx" HotSpotMode="PostBack" Target="_blank" PostBackValue="UserState" /> </asp:ImageMap> <asp:Label ID="lblShow" runat="server" Width="312px"></asp:Label> </div> 7.HyperLink :相當於HTML中的<a href=""></a>標簽 8.刪除 (1): GridView 盡量不要用GridView自帶的刪除按鈕,因為不會提示 自帶刪除 1: 設置數據源的Delete方法 2: 設置GridView的DataKeyNames--Id 3: 不會提示用戶刪除 (2): 添加子定義模板,用來刪除 添加一個LinkButton (3): 獲取刪除項ID LinkButton --> CommandArgument (4): 設置OnClientClick屬性 4.1 直接設置 4.2 RowDataBound 中寫代碼 (5): 設置CommandName-->MyDel[千萬別省事,寫成Del] (6): 訂閱GridView的RowCommand,也可以訂閱LinkButton的Click事件 修改 (1): 編寫修改的BLL層方法,參數一般不能是實體類,而是參數列表 參數的名字應該和實體類的屬性對應,但不區分大小寫,可以自由排列 (2): 如果遇到html格式的內容,應設置Page的ValidateRequest="false" (頁面最上面寫) (3): 如果不使用自定義模板,那么將不更新字段的ReadOnly設置為true (4): 如果更新的方法參數沒有對應的更新項,那么應在ItemUpdating賦值 (5): 如果使用自定義模板列,注意Bind和Eval區別 (6): 如果要添加驗證,必須變成模板列 第七章: 1.GridView展示:多行多列數據 DataList 展示:多行單列數據 Repeater展示:單行多列數據 2.PagedDateSource類的分頁 CurrentPageIndex 當前頁 PageCount 總頁數 Count 總記錄數 PageSize 每頁記錄數 DataSource 數據源 AllowPaging 控件是否自動分頁 IsFirstPage 控件是第一頁 IsLastPage 頁面是最后一頁 缺點:不能超過一萬行的數據,占用資源 例: PagedDataSource savePage = new PagedDataSource(); savePage.DataSource = BookManager.GetOrderedSmallBooksByCategoryId(0, ViewState["Order"].ToString()); savePage.AllowPaging = true;//不寫不會分頁 savePage.PageSize = 12; savePage.CurrentPageIndex = Pager; this.Repeater.DataSource = savePage; this.Repeater.DataBind();//不寫不會顯示 3.ViewState["名稱"]=值;頁面級別的信息保持,不影響其它頁面的分頁 第八章 1. 使用FreeTextBox控件:將FreeTextBox.dll拖入工具箱中,就可以使用 注意:使用該控件,需要在Page指令上添加ValidateRequest="false" 2.CodeSmith工具:編寫代碼是在CodeSmith Studio中,運行在CodeSmith Explorer中 使用條件:表要有主鍵,但不能有組合鍵 模板聲明:<% CodeTemplate Language="C#" TargetLanguage="C#" Description=""%> TargetLanguage:生成文件類型,如果要生成.sql文件,則標記為“T-SQL” 定義參數:<% Property Name="Number" Type="Int32" Category="Context" Description=""%> Name:參數名 Type :參數類型 Category:生成的模板顯示的是輸入框還是下拉框等。 如果涉及到數據庫訪問,需要引入相關的組件並聲明命名空間,代碼如下: <%@ Assembly Name="SchemaExplorer" %> <%@ Import Namespace="SchemaExplorer" %> CodeSmith編碼例子:(創建一個更新的存儲過程) <%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Template description here." %> <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="????" %> <%@ Property Name="ModelsNamespace" Default="Models" Type="System.String" Category="Context" Description="????" %> <%@ Assembly Name="SchemaExplorer" %> <%@ Import Namespace="SchemaExplorer" %> Create PROCEDURE [Pro_Update<%=SourceTable.Name%>] <%for(int i=0;i<SourceTable.Columns.Count;i++)%> <%{%> <%=GetType(SourceTable.Columns[i])%><% if(i<SourceTable.Columns.Count-1)%><%{%>,<%}%> <%}%> as Update Books set <% for(int i=0;i<SourceTable.Columns.Count;i++) %><%{%><%=GetColumn(SourceTable.Columns[i])%><% if(GetColumn (SourceTable.Columns[i]) !="" && i<SourceTable.Columns.Count-1)%><%{%>,<%}%><%}%> where Id=@<%=SourceTable.PrimaryKey.MemberColumns[0].ToString().Substring(SourceTable.PrimaryKey.MemberColumns[0].ToString ().LastIndexOf(".")+1)%> <script runat="template"> public string GetType(ColumnSchema column) { string para="@"+column.Name+" "+column.NativeType; switch(column.DataType) { case DbType.String: case DbType.AnsiString: case DbType.AnsiStringFixedLength: case DbType.StringFixedLength: para+="("+column.Size+")"; break; } return para; } public string GetColumn(ColumnSchema column) { string para; if(SourceTable.NonPrimaryKeyColumns.Contains(column)) para=column.Name+"=@"+column.Name; else para=""; return para; } </script> 第九章 1.ASP.NET在處理HTTP請求時的兩個核心的機制是HttpModule和HttpHandler 2.用戶控件 后綴名:.ascx (Web 用戶控件) 注意: (1).用戶控件可以包含其它用戶控件 (2).用戶控件不可以單獨訪問 (3).用戶控件不可以自己訪問自己 (4).不能導入Style樣式 (5).內容頁的Load事件比用戶控件的Load事件先執行 3.HttpHandler程序:后綴名:.ashx (一般處理程序) 注意:public void ProcessRequest(HttpContext context){} 是該程序運行的最終方法,程序運行從該方法開始 該程序可直接訪問,並且輸出context.Response.Write("Hello World");括號中寫的內容 context.MapPath(context.Request.Params["ISBN"].ToString()+".jpg");可獲取文件的物理路徑 4.在Web.config配置文件的<system.web></system.web>節點中寫<add verb="*" path="Image/BookCovers/*.jpg" type="CoverHandler/"> 當應用程序訪問Image/BookCovers/下面的圖片格式為.jpg時,將自動訪問ConverHandler類 werb:代表(Get,Post,FTP等)列表,*為通配符,此處表示所有的請求 5.HttpHandler程序默認不能訪問session對象,必須實現System.Web.SessionState.IRequiresSessionState接口才行,否則報錯 示例: public class ValidHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState { public void ProcessRequest(HttpContext context) { } } 第十章 1.如果網站有上傳功能,要過濾掉文件名為*.aspx ,*.ashx, *.asp 2.在Web.config中自定義節點必須現在<configSections>中聲明,例如: <configSections> <section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" /> </configSections> 3.加密一個特定網站的web.config文件 在SDK 命令提示中aspnet_regiis -pef "connectionStrings" "E:\ASP\資料\用戶控件和內容頁的相互傳值\Web" -prov "DataProtectionConfigurationProvider" 解密: aspnet_regiis -pdf "connectionStrings" "E:\ASP\資料\用戶控件和內容頁的相互傳值\Web" -prov "DataProtectionConfigurationProvider" 4.自定義錯誤: <customErrors defaultRedirect="~/ErrorPage.htm" mode="RemoteOnly"> <error statusCode="404" redirect="FileNotFound.htm"/> </customErrors> defaultRedirect代表發生錯誤時,瀏覽器重定向到的URL mode指示啟用(On).禁用(Off)自定義錯誤,還是只讓其顯示給遠程計算機(RemoteOnly),一般用RemoteOnly error子標簽用於定義一些特殊的錯誤,屬性: statusCode:HTTP錯誤的狀態碼,比如,403為禁止訪問、404為文件未找到、500為內部服務器錯誤等 redirect:用於指定當該狀態的錯誤發生時,重定向到的頁面的URL 5.調試: <!-- 設置 compilation debug="true" 將調試符號插入 已編譯的頁面中。但由於這會影響性能,因此只在開發過程中將此值設置為 true。部署時將此值設置為false --> <!-- 通過 <authentication> 節可以配置 ASP.NET 使用的 安全身份驗證模式, 以標識傳入的用戶。 --> <compilation debug="true"> <assemblies> <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> </assemblies> </compilation> 6.運行時配置:<httpRuntime enable="true" executionTimeout="15" maxRequestLength="4096"/> enable:設置為應用程序的狀態,如果設置為false,則相當於關閉了該站點 executionTimeOut:程序執行時間的上限,如果執行一個復雜的循環,如果時間超過了設定的時間,程序將自動結束掉 maxRequestLength:設置最大上傳內容大小,默認為4096KB(4MB)。 7.在Visual Studio 2005 命令提示中輸入aspnet_regsql 可以創建aspnetdb.mdb數據庫 注意:aspnetdb.mdb數據庫可自行附加到數據庫中 8.部署 部署前准備: (1).在web.config中關閉調試功能 <compilation debug="false"> <assemblies> <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> </assemblies> </compilation> (2).使用Release的方式編譯應用程序 9.發布站點方式: (1).XCopy方式 語法:xcopy 源目錄 目標目錄 /f /e /k /h 示例:Xcopy D:\MyBookShop\Web D:\Web\Default.aspx (2).復制站點 操作:在“解決方案管理器”的工具欄上有一個復制站點的選項 缺點:網站可能被別人破解 (3).發布預編譯網站(常用方式) 操作:右鍵單擊“解決方案管理器”中的Web項目,“允許更新此預編譯站點”勾上,其它兩個復選框不勾,如果“使用此命名和單頁程序 集”勾上,則站點容易被破解 補充: 1.設置DIV的overflow:hidden 可使DIV過多的時候也不會被撐大,其它內容會自動隱藏 2.使用WdatePicker.js 日期控件 <asp:TextBox ID="TextBox10" runat="server" Text='<%# Bind("PublishDate") %>' CssClass="Wdate" onFocus="new WdatePicker(this,'%Y-%M-%D',true,'default')"></asp:TextBox> 3.代碼生成sqlite數據庫及表 private static string datasouce = ConfigurationManager.AppSettings["ConnectionString"].ToString(); if (!File.Exists("StoreImage.db3")) { SQLiteConnection.CreateFile("StoreImage.db3"); string sql = "Create Table myPictures(imageID int,imageFile image)";//創建表myPictures SQLiteCommand cmd = new SQLiteCommand(sql, new SQLiteConnection(datasouce)); cmd.Connection.Open(); cmd.ExecuteNonQuery(); cmd.Connection.Close(); } App.config 文件代碼 <configuration> <appSettings> <add key="ConnectionString" value="Data Source=|DataDirectory|\StoreImage.db3"/> </appSettings> </configuration>