【转】Asp.net控件开发学习笔记整理篇 - WebControl基类
最近一直在做MVC項目,對于WEBFORM 好像快忘記了。周末無聊,順帶看看他人的筆記。再次溫習(xí)下。
復(fù)習(xí)大綱:
導(dǎo)航、頁面生命周期及其它導(dǎo)論
一、服務(wù)器控件生命周期
二、控件開發(fā)基礎(chǔ)
三、Asp.net服務(wù)端狀態(tài)管理
四、Asp.net客戶端狀態(tài)管理
五、數(shù)據(jù)回傳
六、WebControl基類
七、服務(wù)器控件事件
?
?
WebControl基類
?????在Asp.net控件開發(fā)中,WebControl基類給我們提供了對于控件的Style更加靈活的解決方案,因為在System.Web.UI.Control基類中只能手動的輸入呈現(xiàn)在客戶端的代碼,但如果開發(fā)的服務(wù)器控件對style的要求較高。那Control基類的局限性就顯而易見了,而繼承WebControl類作為基類將會是很好的選擇。
???? System.web.UI.WebControls.Webcontrol直接繼承與Control類。在繼承了Control的特性的基礎(chǔ)上,WebControl基類不僅在生成客戶端html使用了另一種更好的render方式,并且還提供了對于老版本瀏覽器的兼容。
?
WebControl的ControlStyle屬性
?
?????ControlStyle屬性其實是System.Web.UI.WebControls.Style的一個實例,這個屬性用于讀取或者設(shè)置常用的CSS類,以下是System.Web.UI.WebControls.Style的屬性和CSS屬性的對應(yīng)關(guān)系。
| Style的屬性 | CSS標(biāo)準(zhǔn)屬性 |
| BackColor | background-color |
| BorderColor | border-color |
| BorderStyle | border-style |
| BorderWidth | border-width |
| CssClass | CSS的類名 |
| Font | Font weight, style, family, and so on |
| ForeColor | color |
| Height | height |
| width | width |
?
而在ControlStyle.Font是一些設(shè)置字體的屬性,是System.Web.UI.FontInfo對象的實例。和標(biāo)準(zhǔn)CSS屬性的對照如下表:
?
| Font?屬性 | CSS標(biāo)準(zhǔn)屬性 |
| Bold | font-weight: bold |
| Italic | font-style: italic |
| Name | font-family |
| Names | font-family |
| Overline | text-decoration: overline |
| Underline | text-decoration: underline |
| Size | font-size |
| Strikeout | text-decoration: line-through |
?
WebControl基類ControlStyle屬性的簡化
???下面這行代碼:
??????webcontrol.ControlStyle.BorderWidth = 1;和?webcontrol.BorderWidth = 1;
代碼是等價的,WebControl基類可以不通過ControlStyle屬性而訪問ControlStyle內(nèi)的成員,這樣在前臺可以直接對控件進(jìn)行style設(shè)置,剛才的后臺代碼于如下前臺代碼是等價的:
<cc:WebControl?id="WebControl"?runat="server"?borderwidth="1"/>
WebControl的Style屬性
因為ControlStyle屬性只暴露了一部分可用于操控CSS的屬性,而除了上述ControlStyle暴露的基本的CSS屬性設(shè)置之外,WebControl基類還為我們提供了Style屬性用于對CSS進(jìn)行精確完整的操作,可以用如下圖讓概念更加清晰:
Style屬性是System.Web.UI.CssStyleCollection這個類的實例,style屬性大多在.aspx文件中用到,比如:
<asp:Button?ID="Button1"?runat="server"?Text="Button"?style="?background:blue;"???/>
而與上面對Style賦值等價的后臺代碼則是:
Button1.Style["background"] =?"blue";
或者
Button1.Style.Add("background",?"blue");
?
一個新的Render系統(tǒng)
???和集成Control并重寫Render方法不同,WebControl給我們提供了一個新的系統(tǒng)用于Render控件。下面寫一個Label的Demo:
Demo:label控件
代碼如下:
??? [ToolboxData("<{0}:label runat=server></{0}:label>"),DefaultProperty("Text")]
????public?class?Label?:?WebControl
??? {
????????public?Label():?base(HtmlTextWriterTag.Span)
??????? {
??????? }
????????public?virtual?string?Text
??????? {
????????????get
??????????? {
????????????????object?text = ViewState["Text"];
????????????????if?(text ==?null)
????????????????????return?string.Empty;
????????????????else
????????????????????return?(string)text;
??????????? }
????????????set
??????????? {
??????????????? ViewState["Text"] =?value;
??????????? }
??????? }
????????override?protected?void?RenderContents(HtmlTextWriter?writer)
??????? {
??????????? writer.Write(Text);
??????? }
?}
?在構(gòu)造函數(shù)中,我們可以看出public?Label():?base(HtmlTextWriterTag.Span)和從前繼承于Control基類的方式有所不同,通過HtmlTextWriterTag枚舉對象,我們所有生成的內(nèi)容都會在Html的<span>標(biāo)簽內(nèi).而在最后用RednerContents函數(shù)來render內(nèi)容時并不需要自己寫相應(yīng)的html標(biāo)簽,而是構(gòu)造函數(shù)內(nèi)的選擇了span,則webcontrol幫你生成相應(yīng)的html標(biāo)簽。
?
?WebControl本身內(nèi)置的render系統(tǒng)分為四個函數(shù),依次進(jìn)行,可以用下圖表示:?
其中AddAttributesToRender函數(shù)在后面說到,根據(jù)順序我們可以發(fā)現(xiàn),WebControl在生成Html方面要大大強于Control基類的生成方式。就這個Label控件來說,生成的過程會是
1:RenderBeginTag
根據(jù)HtmlTextWriterTag枚舉類型來確定生成的html標(biāo)簽的種類,在這里這個方法會生成
<span
2:AddAttributesToRender函數(shù)生成控件相關(guān)的html屬性在這里可能會接著上面生成
<span title=”xx”
3:renderContents函數(shù)生成控件中的內(nèi)容,在這個Label控件會接著生成類似如下:
<span title=”xx”>這里是文本內(nèi)容
4:RenderEndTag這個函數(shù)也是根據(jù)HtmlTextWriteTag枚舉來確定生成的html關(guān)閉標(biāo)簽,在這里會接著上面生成:
<span title=”xx”>這里是文本內(nèi)容</span>
?
因為在這個Demo中我們只覆蓋了RenderContents函數(shù),而沒有涉及到AddAttributesToRedner函數(shù),而RenderBeginTag和RenderEndTag會根據(jù)基類構(gòu)造函數(shù)中的HtmlTextWriterTag枚舉類型生成相應(yīng)的html標(biāo)簽.如果在前臺這么用這個控件:
<asp:Label?runat="server"?Text="測試Text"></asp:Label>
?
則render后生成相應(yīng)的Html代碼是:
<span>測試Text</span>
?
?
這樣的render方式.可以讓你省去手動輸入html,而只需要重載你需要自己實現(xiàn)的步驟。在通常情況下RenderBeginTag和RenderEndTag幾乎很少被重載。而被重載最多的也就是AddAttributeToRender和RenderContents方法.
?
AddAttributeToRender方法
??AddAttributeToRender方法是最常用的,這個方法通過鍵/值對添加屬性,比如前幾章的TextBox控件,如果Render的過程中引入了這個方法,那么會容易很多.頁面的Render部分只需要如下一些代碼即可:
???
????????public?Textbox():?base(HtmlTextWriterTag.Input)
??????? {
?
??????? }
??? ???override?protected?void?AddAttributesToRender(HtmlTextWriter?writer)
??????? {
??????????? writer.AddAttribute("type",?"text");
??????????? writer.AddAttribute("name", UniqueID);
??????????? writer.AddAttribute("value", Text);
????????????base.AddAttributesToRender(writer);
??????? }
需要特別注意的是,在override?? AddAttributesToRedner方法時,一定不要忘了加上最后的那句base.AddAttributesToRender(writer);
?
轉(zhuǎn)載于:https://www.cnblogs.com/taoqianbao/p/3486237.html
總結(jié)
以上是生活随笔為你收集整理的【转】Asp.net控件开发学习笔记整理篇 - WebControl基类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: filebeat + es 日志分析
- 下一篇: C++模板使用介绍