版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
階段引發(fā)的事件初始化頁面Page_Init加載頁面Page_Load驗證Validate事件處理Formeventhandler頁面顯示之前Page_PreRender頁面卸載Page_UnloadWeb窗體頁的生命周期ASP.Net服務(wù)端基本控件介紹ASP.Net服務(wù)端控件是ASP.Net對HTML的封裝,在C#代碼中就可以用txt1.Text=‘a(chǎn)bc’這種方式來修改input的值,ASP.Net會將服務(wù)端控件轉(zhuǎn)成HTML代碼輸出給瀏覽器。服務(wù)端控件是ASP.Net非常吸引初學者、非常容易上手的東西,也是最被人詬病的東西。物盡其用,服務(wù)端控件在內(nèi)網(wǎng)系統(tǒng)、互聯(lián)網(wǎng)系統(tǒng)的后臺部分等訪問頻率不高的地方用的還是很適合的。在服務(wù)端控件的標簽中寫的屬性如果不是控件內(nèi)置的屬性就會被原樣的輸出到客戶端所有的ASP.Net大部分都是從Control、WebControl類繼承的,幾乎都有的成員有:(1)ClientID,控件在客戶端的Id,控件在服務(wù)端的Id不一定等于客戶端HTML中的Id,比如說在ListView等控件的模板中。因此如果要在客戶端通過JavaScriptDom、JQuery的getElementById、$(“#id”)來操作控件的話最好不要直接寫服務(wù)端Id,而是$(‘#<%=txt1.ClientID%>’)。用JQuery事件設(shè)置鼠標移到控件上和從控件移開的不同樣式。在用戶控件中就可以看到ClientID和id的不同。UserControl、母版、ListView。推薦永遠用ClientID(2)Visible屬性,控件是否可見,如果Visible=False是不會轉(zhuǎn)到HTML中的,這和在HTML中給元素style.display='none'效果是不一樣的。(3)CssClass屬性,控件的樣式名,就是HTML中控件的class屬性。也可以單獨修改BackColor、BorderStyle等屬性,但是不建議這么做,因為會生成很多的內(nèi)聯(lián)樣式,生成html尺寸大,不便于統(tǒng)一的修改。(4)Attributes,用來設(shè)置獲取控件的額外屬性。和Dom中的setAttribute()、getAttribute()是一樣的。Button1.Attributes[“a1”]=“2.jpg”;HTML
事件在服務(wù)端看來也是屬性
Button1.Attributes[“onmouseover”]=“alert(‘hello’)”;服務(wù)端控件的額外屬性說明:所有的服務(wù)端控件不僅可以使用控件定義的屬性,還可以使用額外的屬性,這些屬性包括控件沒有封裝的HTML屬性(比如onmouseover等瀏覽器端事件頁當作屬性),ASP.Net會將它不識別的屬性原封不動的渲染到客戶端。在代碼中也可以通過Attributes屬性設(shè)置額外屬性:CheckBox1.Attributes["onmouseover"]="alert('hello')";請求響應(yīng)模型的例子(重點)按鈕實現(xiàn)表格行刪除效果;使用超鏈接進行刪除,代碼見備注。這就是中數(shù)據(jù)綁定控件中行按鈕和行超鏈接實現(xiàn)方式的不同。ListView中Button、HyperLink兩種行刪除方式。按鈕方式是將行的id通過表單提交到服務(wù)器,行超鏈接的方式是通過超鏈接的url通過get的方式提交給處理頁面,超鏈接的方式由于沒有提交所有的表單信息,因此很多服務(wù)端控件的高級用法用不了。用超鏈接實現(xiàn)的Post和普通超鏈接的區(qū)別。用aspx重寫,超鏈接的因為沒有向服務(wù)器提交ViewState等隱藏字段,所以處理時IsPostBack是False,而按鈕的則是提交了表單,所以IsPostBack=True??梢栽诔溄拥膆ref中寫表單提交的JavaScript,這樣就是WebForm中LinkButton的原理。客戶端、服務(wù)端由于在兩臺計算機中,所以無法做到兩邊變量的互相讀取或者兩邊函數(shù)的互相調(diào)用,所以如果想看起來好像做到,那么必須通過提交的方式來將客戶端變量值做為一個表單字段提交到服務(wù)器、或者服務(wù)端將服務(wù)端變量打印到客戶端代碼中。ASP.Net服務(wù)端基本控件11、Label控件。Text屬性為顯示文本。AssociatedControlID屬性用來關(guān)聯(lián)一個控件,如果為空的話會展示為一個Span,如果指定為一個控件的id,則會展示為一個HTML中的<Label>并且將for屬性設(shè)置為被關(guān)聯(lián)控件的ClientId。2、Literal控件也是展示一段文本,但是Literal控件不會渲染任何額外的標簽,就是將Text屬性的值展示出來而已。3、TextBox控件,文本框控件。TextMode屬性取值SingleLine、MultiLine、Password,分別渲染為input(type=text)、textarea和input(type=password)。當AutoPostBack屬性為true的時候,用戶焦點離開TextBox就會造成頁面Post,實現(xiàn)原理就是講ASP.Net原理時的AutoPostBack。TextChanged事件(需要AutoPostBack=true才會修改后觸發(fā),否則是頁面提交才觸發(fā)),文本發(fā)生變化的時候事件觸發(fā)。ASP.Net中要提交表單的時候最好調(diào)用__doPostBack方法。4、RadioButton控件,對應(yīng)為input(type=radio),通過GroupName屬性進行分組ASP.Net服務(wù)端基本控件Button5、Button控件。OnClientClick屬性,當用戶點擊按鈕的時候在瀏覽器端執(zhí)行的代碼,注意OnClientClick是字符串屬性,寫的代碼是JavaScript代碼,運行在瀏覽器端。<asp:ButtonID="btnDel"runat="server"onclientclick="returnconfirm('真的要刪除嗎?')"Text="刪除"/>6、LinkButton,用法和Button差不多,區(qū)別就是Button控件渲染為按鈕,而LinkButton渲染為超鏈接。不要用LinkButton來實現(xiàn)普通的超鏈接,因為LinkButton的href為一段javascript代碼,進行的是表單的Post,無法“在新窗口中打開連接”。和講“行刪除”那個例子中href為javascript的超鏈接原理一樣。一般用Button就行,只有用戶要求“長成超鏈接好”采用LinkButton,就是一個在瀏覽器中渲染成超鏈接,服務(wù)端當成按鈕用的東西。HyperLink:IsPostBack=False,沒有提交表單內(nèi)容,沒有OnClick事件。7、ImageButton控件也和Button差不多,只不過是顯示為圖片,渲染為input(type=image)8、Button、LinkButton、ImageButton等控件都有CommandName、CommandArgument兩個屬性和Command事件,可以讓多個按鈕控件共享一個Command事件處理函數(shù),通過讀取事件對象e的CommandName、CommandArgument兩個屬性讀取被點擊按鈕上設(shè)置的這兩個參數(shù)來執(zhí)行不同的操作。例子:編輯、刪除多行數(shù)據(jù)。這種用法在ListView等控件中用的最多。ASP.Net服務(wù)端基本控件39、Panel控件用來盛放一些控件。如果設(shè)定GroupingText屬性那么就渲染為含有<fieldset>的div標簽,也就是GroupBox效果,否則渲染為<div>10、HyperLink控件,超鏈接。和LinkButton不一樣(???,不會向服務(wù)器端Post,就是一個超鏈接。NavigateURL:鏈接地址;Text:顯示文本。如果設(shè)定ImageUrl屬性則會顯示圖片超鏈接。如果就是指向新浪網(wǎng)這種外部頁面完全不用HyperLink,HyperLink主要的優(yōu)勢在于會自動將虛擬路徑轉(zhuǎn)換為客戶端路徑。11、FileUpload控件,文件上傳控件。渲染成input(type=file)。屬性:FileContent以流形式獲得上傳的文件;FileName上傳文件名;HasFileBool值,表示用戶是否選擇文件,SaveAs方法用于將文件保存到磁盤的指定位置。漏洞:文件上傳漏洞(上傳一個下載源代碼的aspx、Process.Start啟動格式化,創(chuàng)建管理員、開啟遠程桌面)。解決方法:只允許上傳指定類型文件,上傳文件夾不給執(zhí)行權(quán)限。WebShell。三種控件HTML控件,ASP.Net把HTML控件當成普通字符串渲染到瀏覽器端,不去檢查正確性、無法在服務(wù)器端進行處理。ASP.Net服務(wù)端控件,經(jīng)過ASP.Net高度封裝的控件,使用簡單,運行在服務(wù)器端,可以在服務(wù)端使用C#代碼進行操作,會渲染到客戶端為HTML控件。runat=server的HTML控件。在HTML控件的基礎(chǔ)上添加runat="server",也是運行在服務(wù)器端的,也可以服務(wù)端使用C#代碼進行操作,也會渲染到客戶端,不像ASP.Net服務(wù)端控件那樣高度封裝,暴露的屬性大部分是普通HTML屬性。和ASP.Net服務(wù)端控件相比的好處是:當需要在服務(wù)器端要對控件進行操作的時候,如果控件沒有被ASP.Net服務(wù)端控件封裝的時候,用runat=server的HTML控件很方便,runat=server的HTML控件也會對虛擬路徑、id→ClientID進行處理,所以在使用虛擬路徑、UserControl中也可能會用到,試驗在WebUserControl中使用id
onmouseover="document.getElementById('<%=TextBox1.ClientID%>').value='哈哈';"直接在屬性中有問題,會把<%直接輸出到瀏覽器端,因此不要在控件的屬性值中寫<%%>。run=server控件的好處,中庸!1、不像ASP.Net服務(wù)端控件那么重量級、封裝的那么多,程序員可以比較好的控制生成內(nèi)容的質(zhì)量。更容易讓美工來使用,因為美工不認得<asp:TextBox2、相對于html控件: 1)能夠在服務(wù)端代碼中操作控件 2)能夠自動處理虛擬路徑~ 3)可以處理ClientID。選擇的順序:HTML→run=server的HTML→ASP.Net服務(wù)端控件HTML控件(runat=server)對應(yīng)服務(wù)器類型a→HtmlAnchor;form→HtmlForm;head→HtmlHead;input→HtmlInputButton、HtmlInputCheckBox、HtmlInputText等;meta→HtmlMeta;table→HtmlTable;tr→HtmlTableRow;td→HtmlTableCell;title→HtmlTitle。未單獨封裝的標簽(比如div)或者自定義的標簽(比如mmm)對應(yīng)類型為HtmlGenericControl。使用Attributes屬性操作未封裝的屬性。不用單獨記憶,忘了的話,在aspx中弄一個標簽試驗一下就行。服務(wù)端HTML控件不像ASP.Net控件那樣封裝的高級,比如ASP.Net控件的BgColor屬性為Color類型,而HTML控件的BgColor屬性則為字符串類型,需要開發(fā)人員設(shè)置合法的值數(shù)據(jù)綁定控件簡介數(shù)據(jù)綁定分為數(shù)據(jù)源和數(shù)據(jù)綁定控件兩部分,數(shù)據(jù)綁定控件通過數(shù)據(jù)源來獲得數(shù)據(jù),通過數(shù)據(jù)源來隔離數(shù)據(jù)提供者和數(shù)據(jù)使用者,數(shù)據(jù)綁定控件通過數(shù)據(jù)源來對數(shù)據(jù)進行修改,數(shù)據(jù)源有SqlDataSource、AccessDataSource、ObjectDataSource、LinqDataSource、EntityDataSource、XmlDataSource等(SiteMapDataSource是SiteMap專用數(shù)據(jù)源),由于大部分項目都不會頁面直連數(shù)據(jù)庫(因為違反最基本的分層原則),所以SqlDataSource、AccessDataSource不會使用,LinqDataSource、EntityDataSource也是只有在很極端的采用Linq、EF的項目中才會用,XmlDataSource是處理XML數(shù)據(jù)是才可能會用。ObjectDataSource是Web開發(fā)中應(yīng)用最廣的數(shù)據(jù)源,也能很容易的進行數(shù)據(jù)庫切換。數(shù)據(jù)綁定控件有列表數(shù)據(jù)綁定控件(DropDownList、RadioButtonList、ListBox、CheckBoxList、BulletedList等)和復雜控件(DataGrid、GridView、DetailsView、FormView、ListView、Repeater、DataList等,GridView等都是ListView子集)。復雜控件中DataGrid已經(jīng)不推薦使用,Repeater是最輕量級的組件,在互聯(lián)網(wǎng)的前臺用的最多,ListView是GridView、DetailsView、FormView、Repeater、DataList等這些控件的大一統(tǒng)者,那些控件的優(yōu)點ListView全都有,會了ListView那些控件也就會用了,因此數(shù)據(jù)綁定控件主要講列表數(shù)據(jù)綁定控件、Repeater和ListView,項目中會用到FormView、GridView。ObjectDataSourceObjectDataSource用來將一個類做為數(shù)據(jù)源,TypeName屬性為數(shù)據(jù)源類的全名,有DeleteMethod(刪除方法)、InsertMethod(新增方法)、SelectMethod(查詢方法)、UpdateMethod(修改方法)等幾個屬性,分別為類中刪除、插入、查詢、更新數(shù)據(jù)的方法名,這些方法可能有參數(shù),參數(shù)的值是通過DeleteParameters、UpdateParameters、InsertParameters等嵌套節(jié)點設(shè)置的。ObjectDataSource訪問自己寫的普通類,在類上標注[DataObject]DataObjectMethod手工編寫ObjectDataSource太麻煩,使用可視化界面來完成。將ObjectDataSource拖放到界面上,在右上角的智能標志上選擇“配置數(shù)據(jù)源”即可進行配置。數(shù)據(jù)源類一般用數(shù)據(jù)集就可以,新建一個數(shù)據(jù)集,將表拖進來生成DataTable、Adapter等,生成完成后,在ObjectDataSource的“配置數(shù)據(jù)源”中就可以看到Adapter類,選中類,選擇【下一步】,分別選擇對應(yīng)的獲得、刪除、更新、插入數(shù)據(jù)的方法。列表綁定控件DropDownList顯示來自于ObjectDataSource的數(shù)據(jù),選擇數(shù)據(jù)源(DataSourceID屬性)為剛才的ObjectDataSource,并且設(shè)定顯示字段(DataTextField)和值字段(DataValueField)即可。RadioButtonList、ListBox、CheckBoxList、BulletedList等也都是這么用。手工設(shè)定綁定,除了可以給控件的DataSourceID屬性設(shè)置一個數(shù)據(jù)源的方式進行數(shù)據(jù)綁定(推薦),還可以在代碼中通過代碼設(shè)置綁定(舊版本的ASP.Net只能這樣綁定,新版本中不推薦)。用代碼綁定可以將任何實現(xiàn)了IEnumerable接口的對象綁定到數(shù)據(jù)綁定控件。ListBox2.DataSource=newobject[]{3,5,6};ListBox2.DataBind();由于數(shù)據(jù)綁定控件默認會將數(shù)據(jù)保存在ViewState中,因此不會每次刷新頁面都會重新加載數(shù)據(jù),只有第一次需要加載(!IsPostBack)由于代碼綁定在禁用ViewState的情況下有很多麻煩事,因此推薦用DataSourceID的方式,控件會自己來判斷是否應(yīng)該重新取得數(shù)據(jù)。DropDownList原有“請選擇性別”和數(shù)據(jù)綁定項的共存:AppendDataBoundItems=“true”,把數(shù)據(jù)綁定的項加到后面。復雜數(shù)據(jù)綁定控件除了顯示Text、Value這樣簡單的列表數(shù)據(jù)綁定控件之外,還有更復雜的數(shù)據(jù)綁定控件的要求,比如要將人員信息顯示在界面上,包含姓名、年齡、照片等。這時候就要使用Repeater、ListView等控件。學HTML的時候是手寫表格,但是項目中很多數(shù)據(jù)不是固定的,而是動態(tài)的??梢杂肈om動態(tài)增加表格行,但是數(shù)據(jù)仍然是固定的,我們需要從數(shù)據(jù)庫等地方取得動態(tài)的數(shù)據(jù)來顯示。比如網(wǎng)站的友情鏈接列表就不是固定的,而是從數(shù)據(jù)庫中動態(tài)讀取動態(tài)生成的。Repeater(今日重點)Repeater(foreach)用于對綁定數(shù)據(jù)源中的數(shù)據(jù)進行遍歷顯示,每條數(shù)據(jù)以什么格式顯示是由Repeater的<ItemTemplate>來決定的,模板會多次顯示,就像foreach,ItemTemplate中相當于{}中的語句。<ItemTemplate>姓名:<%#Eval(“Name”)%><b>年齡:<%#Eval(“Age”)%></b><br/></ItemTemplate>。注意:%和#中間不能有空格。<%#Eval("Name")%>表示在這個位置顯示當前行的Name屬性,注意調(diào)用Eval、Bind這些數(shù)據(jù)綁定方法的時候要用#。因為Eval就是將屬性顯示到指定的位置,因此也可以顯示到文本框中<ItemTemplate>姓名:<inputtype="text"value='<%#Eval("Name")%>'/></ItemTemplate>注意不要寫成value="<%#Eval('Name')%>"因為<%%>中的是C#代碼,''是字符,而不是字符串還可以用在服務(wù)器控件中<asp:TextBoxText='<%#Eval("Name")%>'runat="server"></asp:TextBox>練習:結(jié)合JQuery實現(xiàn)選中行高亮(把Repeater放到table標簽中,ItemTemplate是tr)Repeater其他模板1、<AlternatingItemTemplate>,設(shè)置隔行的不同顯示風格,如果設(shè)定<AlternatingItemTemplate>,則奇數(shù)行用<ItemTemplate>模板,偶數(shù)行用<AlternatingItemTemplate>模板<AlternatingItemTemplate><asp:TextBoxBackColor="Red"ID="TextBox2"Text='<%#Eval("Name")%>'runat="server"/></AlternatingItemTemplate>。設(shè)置隔行變色是為了防止數(shù)據(jù)太多看串行。2、HeaderTemplate、FooterTemplate:頭部、尾部的模板,分別顯示在所有數(shù)據(jù)的前面和后面。3、SeparatorTemplate:兩項數(shù)據(jù)之間的分隔符,比如換行符案例案例:顯示人員信息,姓名、年齡、照片(網(wǎng)站中都是存的圖片路徑案例:鼠標放到圖片上,圖片動態(tài)放大,其他還原。元素動畫漸變:animate({"width":"300","height":"200"})1、ItemTemplate里面用服務(wù)端控件:1)綁定的屬性必須用單引號myname='<%#Eval("Name")%>'。而HTML控件則單引號、雙引號都行。2)屬性值里要么就是普通的值,要么就是整個綁定表達式,不能混著,比如ImageUrl='images/<%#Eval("ImgPath")%>'。HTML控件就沒有這個問題。問題:在服務(wù)端控件中不能寫'~/images/<%#Eval("PicPath")%>',在頁面中增加FormatImgURL方法,參數(shù)為object類型。對于服務(wù)端控件,只能ImageUrl='<%#Eval("PicPath")%>',不能ImageUrl='images/<%#Eval("PicPath")%>'。能不用服務(wù)端控件就不用可以這樣處理<%#"img/"+Eval("APic")%>練習:顯示文章列表。id、標題、作者、鏈接地址。如果標題過長則只顯示前10個字并且加省略號(不用樣式實現(xiàn))不要在aspx中寫過于復雜的C#代碼,如果代碼比較復雜,想辦法提取到cs中練習:顯示友情鏈接列表,字段:網(wǎng)站名、超鏈接、友情鏈接類型(文本、圖片)、Logo圖片地址。文本友情鏈接、圖片友情鏈接分別展示ItemDataBound對于每行數(shù)據(jù)顯示的時候都會調(diào)用ItemDataBound事件,在這個事件中可以對當前行進行處理,事件對象主要成員:1、e.Item.ItemType為當前行的類型,Item為ItemTemplate行、AlternatingItem為AlternatingItemTemplate行,還有Header、Footer等取值。2、ItemIndex當前項的序號3、DataItem當前行綁定的對象。即使沒有設(shè)置AlternatingItemTemplate偶數(shù)行也被識別為ItemType=AlternatingItem如果要在ItemDataBound事件中對ItemTemplate模板中的控件做處理,則必須使用ASP.Net服務(wù)端控件或者runat=server的HTML控件,為控件設(shè)置Id,然后用FindControl根據(jù)Id來取得控件。注意在ASP.Net的模板中不能直接通過控件的Id來操作控件,必須用FindControl找到控件才能操作。案例:年齡大于30行的文本框變?yōu)榧t色;年齡大于30行的行變?yōu)榧t色。ItemCommand可以在模板中放置Button控件(Button、LinkButton、ImageButton),模板中的按鈕一般不寫OnClick事件響應(yīng),而是響應(yīng)Repeater的ItemCommand事件。為Button控件設(shè)定CommandName、CommandArgument屬性,然后在ItemDataBound事件讀取e的CommandName、CommandArgument屬性就可以獲得發(fā)生事件的命令和行參數(shù)了。如果對數(shù)據(jù)進行了操作,則需要Repeater1.DataBind()來重新綁定,從數(shù)據(jù)庫中刷新最新的數(shù)據(jù)。案例:漲一歲,給被點擊的行的年齡增加1。練習:人員管理程序(Id、用戶名、啟用狀態(tài)(bit)),增加【禁用】當前行按鈕,點擊【禁用】點擊的時候提示是否真的要禁用(OnClientClick),如果確實要禁用則將“啟用狀態(tài)”字段設(shè)置為“禁用”。禁用字段顯示為紅色文字。字段變?yōu)榻煤螅酗@示【啟用】按鈕,點擊【啟用】按鈕將“啟用狀態(tài)”字段設(shè)置為“啟用”。2:要求顯示在Table中,每行一個tr。ListViewRepeater一般只用來展示數(shù)據(jù),如果要增刪改查(CRUD)則用ListView更方便。使用向?qū)В◤婎愋蛿?shù)據(jù))來使用ListView會自動生成很多模板,免去手寫模板代碼的麻煩,再進行手工調(diào)整即可。首先設(shè)定數(shù)據(jù)源,然后點擊智能提示中的“配置ListView”,選擇一種布局和樣式,然后根據(jù)需要勾選“啟用編輯”、“啟用刪除”、“啟用插入”、“啟用分頁”,就會自動生成常用的模板。注意這只是提高開發(fā)效率的一個快捷方式,不是唯一的途徑。LayoutTemplate為布局模板,布局模板中必須有一個ID為itemPlaceholder的服務(wù)端控件,項占位符(4.0以后不需要),什么類型無所謂,不會被顯示,itemPlaceholder前面就是相當于Repeater中的HeaderTemplate,itemPlaceholder后面就是相當于Repeater中的FooterTemplate,因此ListView中沒有這兩個模板。ItemTemplate是每一項的模板,AlternatingItemTemplate是隔行顯示的模板,和Repeater一樣。EmptyDataTemplate為數(shù)據(jù)源沒有數(shù)據(jù)的時候顯示的內(nèi)容(Insert也算數(shù)據(jù)),這樣的話可以實現(xiàn)“沒有查找結(jié)果”、“對不起,找不到您要找的數(shù)據(jù)”等,InsertItemTemplate為插入數(shù)據(jù)界面的模板,EditItemTemplate為編輯數(shù)據(jù)的模板,InsertItemTemplate,為插入數(shù)據(jù)的模板,SelectedItemTemplate為標記為Selected的行的模板。1、生成的樣式要提到style中,不要內(nèi)聯(lián)樣式。2、ItemTemplate里面一般也沒必要用<asp:Label展示只讀數(shù)據(jù),所以直接輸出<%#Eval("Name")%>3、LayoutTemplate中必須有一個id為itemPlaceholder的服務(wù)端控件,之上為頭,之下為尾。4、LayoutTemplate表頭內(nèi)容要漢化,所有Template中的不需要顯示的字段,比如Id,都要刪掉。ListViewEditItemTemplate、InsertItemTemplate中控件的綁定表達式為Text='<%#Bind("Age"),因為Eval只是計算表達式的值輸出,而Bind不僅可以計算表達式的值輸出,還可以將用戶填入的值更新到數(shù)據(jù)中,因此Eval是單向綁定,Bind是雙向綁定。通過每行的Insert、Delete、Edit、Cancel等Command進行增刪改,這幾個CommandName被ListView內(nèi)部處理,不需要開發(fā)人員處理,因此自定義的CommandName不要和他們重復。ListView中可以像Repeater那樣為行增加Command按鈕,處理方法和Repeater一樣,ListView也支持Repeater那樣的ItemDataBound事件。和Repeater的不同點:1、判斷數(shù)據(jù)行的類型e.Item.ItemType==ListViewItemType.DataItem(編輯模板也放在這里)2、取得行對應(yīng)的DataRowView:
ListViewDataItemlvDataItem=(ListViewDataItem)e.Item;
DataRowViewrowView=(DataRowView)lvDataItem.DataItem;3、在FindControl的時候注意AlternatingItemTemplate的問題。AlternatingItemTemplate形同雞肋,因為一般都是把ItemTemplate賦值一份過去。一般奇偶行的需求就是“不同顏色”,那么用JQuery在客戶端處理就可以了。(*)ListView中可以使用Validator,只要將Validator放入相應(yīng)的模板中,將Validator手動設(shè)為要驗證的控件的Id,然后設(shè)定相應(yīng)按鈕、控件、Validator為同樣的ValidationGroup,防止不同模板中的Validator互相干擾。將Cancel按鈕的CausesValidation="false"綜合練習:用戶管理字段:主鍵、用戶名、用戶類型(超級用戶、系統(tǒng)管理員、用戶)、創(chuàng)建日期、密碼、是否禁用。密碼以MD5值保存。密碼不顯示、密碼不允許管理員修改,管理員創(chuàng)建的時候給初始密碼888888(和主鍵為Guid類型的一樣,在Inserting的時候e.Values["Password"]=GetMd5("888888")),創(chuàng)建日期默認為當前時間,可以修改。增加【禁用】當前行按鈕,點擊【禁用】點擊的時候提示是否真的要禁用,如果確實要禁用則將“禁用”字段設(shè)置為true。禁用字段顯示為紅色文字。字段變?yōu)榻煤?,行顯示【啟用】按鈕,點擊【啟用】按鈕將“禁用”字段設(shè)置為false。增加重置密碼按鈕,點擊重置密碼按鈕將用戶的密碼重置為888888。DataPagerListView搭配DataPager控件實現(xiàn)分頁。有兩種使用方式,一種是將DataPager聲明到ListView中;一種是DataPager、ListView沒有嵌套關(guān)系,然后將DataPager的PagedControlID設(shè)定為要分頁的ListView。沒有什么區(qū)別,一般用“配置ListView”自動生成的內(nèi)置方式即可。DataPager的PageSize屬性為一頁的條數(shù)。(*)實現(xiàn)IPageableItemContainer接口的控件都可以使用DataPager進行分頁,但是ASP.Net內(nèi)置的控件目前只有ListView實現(xiàn)了這個接口。DataPager中按鈕顯示風格由Fields中的字段設(shè)置,可以放置多個字段,分為“NextPreviousPagerField”(下一頁、下一頁、首頁、末頁等)、“NumericPagerField”(數(shù)字頁號)、“TemplatePagerField”用模板自定義。代碼中選擇相應(yīng)的Field,在屬性視圖中就可以快速修改它們的屬性。DataPager調(diào)整相關(guān)單詞:First:第一;Last:最后;Next:下一個;Previous:上一個。NextPreviousPagerField主要屬性:ButtonCssClass:按鈕的樣式;ButtonType,按鈕渲染成什么(Button按鈕、Link超鏈接、Image圖片);FirstPageImageUrl,【第一頁】按鈕圖片地址;FirstPageText,【第一頁】按鈕文本,這樣可以實現(xiàn)上一頁顯示為“<”,最后一頁顯示為“>>|”這樣的效果;ShowFirstButton,是否顯示【第一頁】,其他按鈕也有對應(yīng)屬性。NumericPagerField主要屬性:ButtonCount,最多數(shù)字的個數(shù);按鈕渲染成什么(Button、Link、Image);CurrentPageLabelCssClass當前頁文本的樣式;NumericButtonCssClass數(shù)字按鈕的樣式。如何實現(xiàn)|<</</頁數(shù)/>/>>|這樣的效果。順序添加NextPreviousPagerField、NumericPagerField、NextPreviousPagerField,將第一個NextPreviousPagerField的First、Previous設(shè)置為可見,Last、Next設(shè)置為不可見,將最后一個NextPreviousPagerField的First、Previous設(shè)置為不可見,Last、Next設(shè)置為可見。ObjectDataSource的參數(shù)各種參數(shù)來源QueryString:頁面?zhèn)鬟f的參數(shù),又叫查詢字符串Formview向ObjectDataSource要顯示/編輯數(shù)據(jù),ObjectDataSource管Adapter的GetDataById要數(shù)據(jù),GetDataById要參數(shù)的值,參數(shù)的值來自于QueryString的BillId,QueryString可能有很多,所以需要用QueryStringParameter指定來自于哪個查詢字符串為什么FormView看不到數(shù)據(jù)?參數(shù)傳過去沒有?id后面多敲了一個>強類型DataSet中Select的字段數(shù)量、名字不能比DataTable的字段少。Inserting中只能為e.Values賦值,不能為界面賦值,因為時機不對。e.Values是準備向數(shù)據(jù)庫插入數(shù)據(jù)的一個容器,在Inserting之前讀取界面將數(shù)據(jù)放到e.Values中,過了Inserting就開始將e.Values中的數(shù)據(jù)插入數(shù)據(jù)庫。高效率分頁微軟不是神仙!ListView默認的分頁是先從數(shù)據(jù)源取得所有數(shù)據(jù),然后再截取當前頁面的部分,在數(shù)據(jù)量非常大的情況下效率非常低,因此默認分頁基本不能用。應(yīng)該是只從數(shù)據(jù)源取得要顯示的數(shù)據(jù)。復習:SQL中語句中取得分頁數(shù)據(jù)。SQL語句中獲得每一行序號的方法:SELECTId,SiteName,LogoURL,Row_Number()over(orderbyId)rownumFROMT_Links,Row_Number()函數(shù)是SQL2005之后提供的一個計算結(jié)果集行號的函數(shù)(不是表的行號),over中指定排序規(guī)則,Row_Number()從1開始。取得第11條至20數(shù)據(jù)(條數(shù)從0開始)的方法,使用子查詢用行號進行再次處理1、第2頁的數(shù)據(jù),每頁10條1,1011,202、N頁,每頁10條10*(n-1)+1,10*n3、N頁,每頁Count條Count*(n-1)+1,count*n高效率分頁在強類型DataSet中增加取得所有數(shù)據(jù)條數(shù)的方法QueryCount,增加取得指定行數(shù)范圍數(shù)據(jù)的方法GetPagedData:select*from(SELECT,Row_Number()over(orderby...)rownumFROMT_Links)twheret.rownum>@startRowIndexandt.rownum<=@startRowIndex+@maximumRows。注意:1、不要用Id做分頁的字段,斷號,“不要讓主鍵參與邏輯運算”。2、一定要有一個排序規(guī)則。由于數(shù)據(jù)集編輯器不支持(不是運行時不支持,只是設(shè)計器不會自動幫我們生成一些東西)Row_Number(),所以創(chuàng)建完成后需要手動在GetPagedData屬性的Parameters中增加兩個參數(shù):startRowIndex、maximumRows(參數(shù)名必須是這兩個,這是由ObjectDataSource的StartRowIndexParamterName、MaximumRowsParamterName確定的,一般不需要改。),都是Int32類型。也可以自己寫B(tài)LL進行封裝。
selecttop@PageSizefromtwhereidnotin(selecttop@pagesize*(1))fromt)好事是高效率分頁ObjectDataSource中EnablePaging屬性設(shè)置為true,SelectCountMethod設(shè)置為QueryCount,SelectMethod設(shè)置為GetPagedData。如果出錯的話看看是不是沒有放置內(nèi)置的DataPager或者外置的DataPager的PagedControlID沒有指向ListView。修改ObjectDataSource的EnablePaging="True",SelectCountMethod設(shè)置為取得行數(shù)的方法。DataPager默認是用PostBack機制,顯示不到地址中,不利于網(wǎng)友間共享,只要指定QueryStringField屬性(比如pagenum)就可以實現(xiàn)超鏈接形式的分頁鏈接。高效率分頁步驟總結(jié)(步驟多,不難)1、增加一個返回總條數(shù)的方法GetCount。目的是告訴一共有多少條數(shù)據(jù),這樣才知道顯示到第幾條為止。。2、增加一個返回指定頁數(shù)的方法:提供這個方法才能知道怎么取特定的區(qū)間。selectt.*from(SELECTId,Name,Row_Number()over(orderbyId)rownumFROMdbo.T_Persons)twheret.rownum>@startRowIndexandt.rownum<=@startRowIndex+@maximumRowsTableAdapter向?qū)гO(shè)計器不支持Over開窗函數(shù),也就無法自動生成startRowIndex、maximumRows參數(shù),所以需要手工添加這兩個參數(shù)。選中“GetPagedData”設(shè)置Parameters屬性。3、配置ObjectDataSource的時候SElect方法選擇“GetpagedData”,才知道調(diào)用哪個方法取區(qū)間的數(shù)據(jù)4、將ObjectDataSource的設(shè)置EnablePaging="true",表示啟用自定義分頁。才知道使用自定義的分頁策略(經(jīng)常容易忘了設(shè)置)。設(shè)定SelectCountMethod="GetCount"屬性,指向總條數(shù)的方法。才知道調(diào)用哪個方法取總條數(shù)。5、因為ObjectDataSource會自動傳這兩個參數(shù)的值,所以SelectParameters中的<asp:ParameterName="startRowIndex"Type="Int32"/><asp:ParameterName="maximumRows"Type="Int32"/>兩個參數(shù)刪掉。6、配置ListView的時候不要忘了啟用分頁。如果是使用外置DataPager的話不要忘了設(shè)置PagedControlId屬性。分析執(zhí)行過程,參數(shù)是怎么傳過去的。驗證控件必須要對用戶輸入的數(shù)據(jù)進行合法性校驗,這些校驗邏輯很多是重復的,比如字段不能為空、必須為日期格式、數(shù)字不能大于100等,而且要同時在客戶端和服務(wù)器端校驗,客戶端校驗提高可用性,服務(wù)端校驗防止惡意攻擊。ASP.Net驗證控件就是為了簡化這些問題而提供的。ASP.Net提供了如下的控件:RequiredFieldValidator:字段必填;RangeValidator:值在給定的最大值、最小值之間;CompareValidator:用于比較兩個值的關(guān)系是否滿足要求或者是否是指定類型的數(shù)據(jù);RegularExpressionValidator:校驗數(shù)據(jù)滿足正則表達式;CustomValidator:自定義驗證。RequiredFieldValidatorControlToValidate設(shè)定要驗證的控件,Text屬性為當被驗證的控件屬性為空的時候顯示的錯誤信息,Text不僅可以寫普通文本,可以寫任何HTML內(nèi)容。有時候控件如果是默認值也認為是空值,比如下拉列表的選中值為“--選擇性別--”、文本框的值為“填入搜索關(guān)鍵詞”,只要將RequiredFieldValidator的InitialValue屬性設(shè)定為“--選擇性別--”、“填入搜索關(guān)鍵詞”就可以。Validator共性頁面中的IsValid屬性用來判斷頁面中的所有Validator是否都校驗通過,只有都校驗通過才為True,即使頁面中的Validator服務(wù)端校驗報錯(禁用JavaScript跳過客戶端校驗),在服務(wù)端方法中的業(yè)務(wù)代碼(比如btn1_Click)也會被執(zhí)行,因此如果代碼在數(shù)據(jù)校驗不通過的不能執(zhí)行則需要判斷IsValid的值。所有驗證控件都有Display屬性,用來決定如何顯示錯誤信息。三個值:Static:沒有錯誤信息的時候控件的visiblity樣式為hidden來實現(xiàn)隱藏;Dynamic:沒有錯誤信息的時候控件的display樣式為none來實現(xiàn)隱藏。這兩者的區(qū)別是display:none和visiblity:hidden隱藏的區(qū)別是visiblity:hidden隱藏控件仍然會占據(jù)空間,而display:none隱藏則不會占空間。Display屬性還可以設(shè)置為None(用來配合后面講的ValidationSummary)幾乎所有控件都有ControlToValidate、Text屬性,不再額外說。所有控件都幾乎在客戶端和服務(wù)器端都要進行校驗。Validator共性如果在一個頁面中同時放置注冊和登錄表單,那么他們的驗證就會同時進行,這樣雖然只是登錄,但是注冊的驗證也會觸發(fā),可以使用驗證組來解決這個問題,將同一組的控件(表單、提交按鈕、Validator等)的ValidationGroup設(shè)為相同的值就可以,這樣的話和Button等觸發(fā)事件的控件的ValidationGroup相同的控件才會校驗。如果將按鈕控件(Button、ImageButton、LinkButton)的CausesValidation屬性設(shè)置為false,則這個按鈕的點擊不觸發(fā)校驗。RangeValidatorRangeValidator:MinimumValue、MaximumValue為最大、最小值,Type屬性為數(shù)據(jù)類型(String、Integer、Double、Date、Currency等)。例子:年齡、畢業(yè)日期在合理范圍內(nèi)。RangeValidator、CompareValidator、RegularExpressionValidator等都不會對非空值進行校驗,所以如果字段不允許為空則需要再使用RequiredFieldValidator控件。MinimumValue、MaximumValue等當然也可以在運行時動態(tài)設(shè)置,比如設(shè)置最大日期為當前日期,DateTime.Now.ToShortDateString()。CompareValidatorCompareValidator:Type屬性同RangeValidator。Operator屬性,比較操作符,可選值DataTypeCheck、Equal、GreaterThan、GreaterThanEqul、LessThan、LessThanEqual、NotEqual。ValueToCompare,所比較的運算符右邊的值。ControlToCompare,設(shè)定與另外一個控件進行比較。例子,校驗工資必須為整數(shù),轉(zhuǎn)正日期必須不能早于于入職日期校驗數(shù)據(jù)類型,不進行范圍的比較:ControlToValidate設(shè)定要校驗的控件,Type設(shè)置要檢驗的數(shù)據(jù)類型,Operator設(shè)定為DataTypeCheck。要進行范圍的比較:ControlToValidate設(shè)定要校驗的控件,Type設(shè)置要檢驗的數(shù)據(jù)類型,Operator設(shè)定為GreaterThan,ValueToCompare為要比較的值。也可以編程的時候動態(tài)設(shè)置。與另外一個控件的值進行比較,ControlToValidate設(shè)定要校驗的控件,Type設(shè)置要檢驗的數(shù)據(jù)類型,Operator設(shè)定為GreaterThan,ControlToCompare設(shè)置為要比較的控件(運算符右邊的控件)。注意驗證控件描述的是“正確條件”,不是“錯誤條件”??丶d一定要明顯高級ValidatorRegularExpressionValidator:ValidationExpression屬性為正則表達式,VS的可視化編輯提供了幾個內(nèi)置的正則表達式,也可以自己寫。案例,校驗Email地址、身份證號碼、QQ號碼(5位至10位的數(shù)字“\d{5,10}”)、個人說明必須在10到50字之間CustomValidator,自定義驗證控件。當ASP.Net內(nèi)置的驗證控件無法滿足要求的時候可以使用CustomValidator。ServerValidate事件為服務(wù)端的校驗代碼,在事件處理函數(shù)中讀取args.Value來獲得待校驗的值,如果值合法則將args.IsValid設(shè)置為true,否則設(shè)置為false。如果為ClientValidationFunction設(shè)定一個函數(shù)名,那么會首先在客戶端調(diào)用指定的JavaScript函數(shù)進行客戶端校驗,否則將只做服務(wù)端校驗。客戶端校驗函數(shù)的簽名為“函數(shù)名(src,args)”,args的屬性以及意義和服務(wù)端的一樣。練習:實現(xiàn)注冊頁面(寫校驗邏輯就行):用戶名(不能為空,長度必須在3—10之間),密碼(不能為空,長度在3—9之間),再次輸入密碼(必須和密碼一樣),郵箱(選填,必須符合郵箱格式),出生日期,畢業(yè)日期(畢業(yè)日期要大于出生日期,小于當前日期),性別(“請選擇性別”、男、女、保密,必填),月份、日(校驗日期中日的數(shù)值在合法范圍內(nèi),{1,3,5,7,8,10,12}是31天,{4,6,9,11}是30天,2月假設(shè)最大固定是29天不考慮閏年平年。,CustomValidator)。匯總錯誤消息使用Validator錯誤消息會顯示在放置的位置,這樣有兩個可能的問題:如果表單非常大,用戶看不到全部的錯誤消息,希望把錯誤消息集
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川省眉山車城中學2024-2025學年高二上學期期末考試歷史試題(含答案)
- 湖南省衡陽市衡山縣2024-2025學年七年級上學期1月期末地理試卷(含答案)
- 物流專業(yè)理論知識競賽理論試題題庫及答案
- 2025年度別墅智能家居安防系統(tǒng)升級合同263篇
- 2024鮮花婚禮布置與婚宴策劃配套服務(wù)合同3篇
- 2024版掛靠聘任協(xié)議書范本
- 2023年教科版三年級科學全冊教案
- 2024年一級建造師之一建工程法規(guī)題庫附完整答案【奪冠系列】
- 福建省南平市九三英華高級中學高三語文月考試卷含解析
- 中國古代建筑屋頂做法
- 學生(幼兒)上學放學交通方式情況登記表
- 提高感染性休克集束化治療達標率
- 2023年湖北省武漢市高考數(shù)學一模試卷及答案解析
- 電動自行車換電柜規(guī)劃方案
- 工程變更、工程量簽證、結(jié)算以及零星項目預算程序?qū)嵤┘殑t(試行)
- 中央廣播電視大學畢業(yè)生登記表-8
- 2023年人民日報社校園招聘72人筆試參考題庫(共500題)答案詳解版
- 《焊接常用工具》課件
- 山東師范大學《古代文學專題(一)》期末復習題
- 員工內(nèi)部崗位調(diào)換申請表
- 選礦廠建設(shè)工程施工組織設(shè)計
評論
0/150
提交評論