ASP.NET服務器控件
服務器控件就是在服務器端解析的控件,在ASP.NET中,就是有runat=server的控件,這些控件經處理后會生成客戶端呈現代碼發送到客戶端,本質上說,服務端控件就是.NET框架中的類。
ASP.NET服務器控件控件可分為以下幾類:
1.HTML服務器控件
它把標准客戶端控件封裝成類,這些類位於System.Web.UI.HtmlControls命名空間中
(如Htmltable,HtmlButton,HtmlHead等)。它們繼承自HtmlControls,它們共有的基本屬性有Attributes,Style,Disabled,TagName。事實上把任何標准客戶端控件加上屬性runat=server,就把這些客戶端控件變成了HTML服務器控件,這時我們就可以在后置代碼中處理這些控件了。注意這時成為了服務器控件了有"三個ID",同時許多服務器控件的操作都能實現(http://kendezhu.iteye.com/blog/718294)。Attributes屬性是一個AttributeCollection類型的集合類,需要傳遞一個鍵/值對集合,Style屬性是一個CssStyleCollection集合,也需要傳遞一個鍵/值對集合。如:
<input id="Button1" type="button" value="button" runat="server"/>
后置代碼:Button1.Attributes.Add("onclick","alter('給我增加了一個客戶端事件')");
Button1.Style.Add("background-color","green");
Html服務器控件中有許多容器控件,如Htmltable,Div,Span等,它們擁有的共同屬性有InnerHtml(是返回或者設置容器控件開閉標簽內的HTML文本)和InnerText(是返回或者設置容器控件開閉標簽內的純文本,HTML文本將被解析為純文本)。
直接雙擊Html服務器控件,會在head里自動添加客戶端事件,要想Html服務器控件觸發服務端事件,要
<input type="button" id="button1" runat="server" value="上傳" onserverclick="buttonclick" />添加一個onserverclick事件,在后置代碼里:
protected void buttonclick(object sender,EventArgs e)
{
}
有倆參數,第一個是觸發事件的對象,通常是object類型,第二個是參數信息,大多數事件的參數類型是
EventArgs。
3.驗證控件
在ASP時代,未防止用戶隨意地輸入錯誤數據,通常要編寫大量的javascript代碼,在客戶端提前預防錯誤。ASP.NET 3.5提供了5中驗證控件,其中4個用於對指定類型的錯誤進行驗證,還有一種可以提供自定義的驗證。這些控件大多在客戶端完成驗證過程,也可以定義服務器的驗證方式。驗證控件位於System.Web.UI.Webcontrols命名空間中,它們都派生自BaseValidtor基類。他們所共有的成員有:
ControlToValidate(指定要驗證的控件)Display(指定錯誤消息如何顯示,Static或Dynamic)
EnableClientScript(是否允許客戶端驗證)ErrorMessage(顯示在錯誤匯總ValidationSummary控件中的錯誤消息)Text(在驗證控件旁邊顯示的錯誤文本)IsValid(判斷相應的控件值是否有效)
SetFocusOnError(當驗證失敗時,是否將焦點位於出錯的控件上)ValidationGroup(當頁面存在多個驗證控件時,指定分組,將避免驗證沖突)
RequiredFieldValidator:必須輸入驗證。
RangeValidator:輸入范圍驗證,主要屬性Type等。
CompareValidator:比較驗證,主要屬性有:ControlToCompare(和那個控件的值比較),Type,
ValueToCompare(和某個固定值比較)。
RegularExpressionValidator:正則表達式驗證,主要屬性有ValidationExpression(正則表達式)。
CustomValidator:自定義驗證,主要屬性ClientValidationFunction(客戶端驗證,指定客戶端函數名),
ServerValidate事件(服務端驗證)。
CustomValidator控件客戶端驗證舉例:
function kehuduan(ct1,args)
{ 獲取要驗證的值 args.IsValue用於返回驗證結果是否符合
if(args.Value=="劉德華"){args.IsValue=true}else{args.IsValue==false}
}
CustomValidator控件服務端端驗證舉例:(要聲明ServerValidate事件,該事件在客戶端驗證完后,頁面產生回發后執行,一般用於與業務邏輯相關的驗證)
Protected void CustomValidator1_ServerValidate(object sender,ServerValidateEventArgs args)
{
try{args.IsValid=args.Value=="劉德華";}catch{args.IsValid=false;}
}
ValidationGroup屬性是用來把驗證控件與一些觸發驗證的控件(比如Button)分成一組的屬性,比如頁面上有三個TextBox和它們的驗證控件及三個Button,如果不分組的話,單擊任何一個Button都會觸發所有的驗證控件對自己所驗證的TextBox進行驗證。分組的話,就只是與該Button一組的驗證控件對自己所驗證的TextBox進行驗證。Button有一個屬性CausesValidation,設置其是否觸發驗證。
要訪問頁面上所有的驗證控件,可以使用Page.Validators集合屬性來遍歷,如:
Protected void CheckBox1_CheckedChanged(object sender,EventArgs e)
{
foreach(BaseValidator item in Page.Validators)
{
item.Enable=CheckBox1.Checked;
item.EnableClientScript=CheckedBox2.Checked;
}
}
用兩個CheckBox來設置這些驗證控件是否允許驗證和是否允許客戶端腳本。
4. 高級Web服務器控件:
屬於Web服務器控件的范疇,這些控件具有更高級的性能和特性,並且會生成大量
的HTML標記和JavaScript腳本來創建用戶界面,比如Calendar控件,AadRotator及TreeView控件等。
Calendar日歷控件主要有兩方面的更能:顯示和選擇日期,在日歷網格中顯示約會或其他信息。
可以使用Calendar的智能標簽為其選擇一種外觀,可以通過SelectionChanged事件來獲取當前選擇的日期:
protected void Calender1_SelectionChanged(object sender,EventArgs e)
{
Label1.Text="當前日期為"+Calender1.SelectedDate.ToShortDateString();
}
用SelectedDate屬性可以獲得選擇的日期。
而SelectionMode屬性枚舉(Day:可以選單個日期,DayWeek:可選單個日期或整周,DayWeekMonth:可選單個
日期,整周或整月)如果選了后兩種模式,就可以通過設置FirstDayOfWeek屬性來設置一周的第一天是星期幾。
用SelectedDates屬性可以獲得選的多個日期。
Protected void Calendar_SelectionChanged(object sender,EventArgs e)
{
Label1.Text="當前選擇的日期為:<br/>";
foreach(DateTime dt in Calendar.SelectedDates)
{
Label1.Text=dt.ToShortDateString()+"<br/>";
}
}
其他樣式屬性:DayHeaderStyle(星期欄)DayStyle(日期)NextPreStyle(下一個月按鈕)
OtherMonthDayStyle(其他月的日期)等。
Calendar有一個DayRender事件(當Calendar顯示時觸發),該事件提供了一個DayRenderEventArgs類型的
參數,通過該參數的Day屬性可以獲得Calendar里的日期,在該事件中我們可以設置一些限制:
protected void Calendar1_DayRender(object sender,DayRenderEventArgs)
{
if(e.Day.IsWeekend)
{
e.Day.IsSelectable=false; (設置不可選)
}
if(e.Day.IsOtherMonth)
{
e.Cell.Text="-"; e.Cell代表一個日期框
}
if(e.Day.Date.Month==3&&e.Day.Date.day==8) 判斷日期是否為3月8號
{
e.Cell.BackColor=System.Drawing.Color.Red;
e.Cell.Text="三八婦女節";
}
}
MultiView控件可以讓開發人員定義多個視圖,在同一時刻只顯示一個,如下代碼:
<asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0">
<asp:View ID="view1" runat="server"></asp:View>
<asp:View ID="view2" runat="server"></asp:View>
<asp:View ID="view3" runat="server"></asp:View>
<asp:View ID="view4" runat="server"></asp:View>
</asp:MultiView>
每個View就代表一個視圖,可以在里面添加任何代碼。ActiveViewIndex代表View的索引,就是頁面加載時
要顯示的視圖。可以通過MultiView的CommandName來轉換視圖,這個CommandName就是Button的一個屬性,
其值可以取PrevView(上一視圖)NextView(下一視圖)SwitchViewByID(View的ID,可以從Button的
CommandArgument獲得View的ID)SwitchViewByIndex(可以從Button的CommandArgument獲得View的索引)
雖然MultiView控件很方便,但不要放過多的控件,因為每次頁面回發時,每個控件狀態都持續化到視圖狀
態中,會給頁面增加負擔,因此建議使用分頁方式設計。
Wizard控件與MultiView控件非常相似,同一時刻只能顯示一個視圖,WizardStep相當於View。前者比后者
提供了更多的定制功能,比如導航按鈕和模板功能等。可以通過智能標簽來選擇樣式及添加刪除修改步驟
,這里面的主要屬性有:Title(步驟名)AllowReturn(過了這一步可不可以返回)。當然是用Wizard控件不
僅僅是顯示用的,更重要的是要完成一些與客戶的交互(比如注冊等)。這就需要配合一些事件來完成這些
更能:ActiveStepChanged(當ActiveStepIndex改變時發生)CancelButtonClick(按下取消按鈕時發生)
FinishButtonClick(按下完成按鈕時發生)NextButtonClick與PrevousButtonClick(按下向下或向上按鈕
時發生)SiderBarButtonClick(在側邊欄處單擊時發生)。
protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e)
{
if (Wizard1.ActiveStepIndex==0)
{
ViewState["0"] = TextBox1.Text;
}
if (Wizard1.ActiveStepIndex==1)
{
ViewState["1"] = TextBox2.Text;
}
}
protected void Wizard1_FinishButtonClick(object sender, WizardNavigationEventArgs e)
{
Label7.Text = ViewState["0"].ToString() + ViewState["1"].ToString() + ViewState["2"].ToString() + ViewState["3"].ToString();
}
protected void Wizard1_CancelButtonClick(object sender, EventArgs e)
{
ViewState["0"]=null;
ViewState["1"]=null;
ViewState["2"]=null;
ViewState["3"] = null;
Wizard1.MoveTo(this.WizardStep1);
}