每一個使用FineUI控件的頁面都必須包含一個PageManager控件,我們可以把PageManager控件看做頁面級別的參數配置(相對於Web.config站點級別的參數配置)。
頁面級別的參數配置
- Theme: 控件主題,目前支持三種主題風格(blue/gray/access,默認值:blue)
- Language: 控件語言(en/zh_CN/zh_TW/...,默認值:zh_CN)
- FormMessageTarget: 表單字段錯誤提示信息的顯示位置(side/qtip,默認值:side)
- FormOffsetRight: 表單字段右側距離邊界的寬度(默認值:20px)
- FormLabelWidth: 表單字段標簽的寬度(默認值:100px)
- FormLabelSeparator: 表單字段標簽與內容的分隔符(默認值:":")
- EnableAjax: 是否啟用AJAX(默認值:true)
- AjaxTimeout: AJAX超時時間(單位:秒,默認值:60s)
- EnableBigFont: 是否啟用大字體,將ExtJS默認11px的字體全部改為12px,否則顯示的中文字體太小(默認值:false)
上面這些參數和Web.config中的一樣,只不過作用域在頁面范圍內,覆蓋Web.config中的同名配置。
還有一些其他配置屬性:
- EnablePageLoading:是否啟用頁面第一次加載提示,默認為居中顯示的加載圖標(默認值:true)
- EnableAjaxLoading:是否啟用AJAX加載提示,默認為位於頁面上方的文字提示(默認值:true)
- ExecuteOnReadyWhenPostBack:是否在每次頁面回發時都執行onReady腳本(默認值:true)
雖然FineUI希望開發人員盡可能少地編寫JavaScript腳本,但有時恰到好處的腳本可以起到事半功倍的效果,比如示例站點就引入了一個外部的default.js來處理用戶點擊左側菜單的事件和地址欄#之后的片段:
1: <html>
2: <body>
3: <form>
4: </form>
5: <script src="./js/default.js" type="text/javascript"></script>
6: </body>
7: </html>
而default.js中的所有代碼都放在一個 functiononReady() {}
的函數體中。
這其實是FineUI的一個約定,FineUI會在ExtJS以及自身的腳本執行完畢后,查找是否存在onReady函數,如果存在就執行此函數。你可以啟用Web.config中的DebugMode,觀察生成的頁面源代碼,在最后你會看到這樣的腳本:
占據整個頁面的面板 - AutoSizePanelID屬性
這是一個你一定不會錯過的屬性,如果希望某個Panel、Window、Tree、TabStrip、RegionPanel或者Form占據整個頁面空間,就需要用到這個屬性,還是看看示例站點的寫法:
讓ASP.NET控件也參與FineUI的AJAX回發 - AjaxAspnetControls屬性
我們曾在第一篇文章提到,FineUI的一個設計理念是“用心實現80%的功能”,也就是說肯定會遇到一些FineUI提供的控件無法完成的任務,怎么辦?我們只好求助於ASP.NET控件,並且FineUI提供了一種優雅的方式讓ASP.NET控件也可以參與AJAX回發過程,這就是AjaxAspnetControls屬性。
如果想讓某個ASP.NET在頁面回發時也更新,可以將其ID放在AjaxAspnetControls屬性中,多個控件ID以逗號分隔,具體用法請參見示例頁面。
那么,FineUI是怎么做到這一點的呢?
道理其實很簡單,FineUI會在AJAX響應時查找生成的HTML片段中的那些ASP.NET控件,拿到ASP.NET生成的HTML並生成更新腳本,如果你用Firebug等調試工具查看一下AJAX請求,能夠很清楚的看到如下交互過程:
如果你能理解上面提到的FineUI的工作原理,可以嘗試一下這個示例。這個示例主要是考察ASP.NET控件Label和Literal在FineUI的AJAX交互過程中的區別,先來看看代碼:
1: <ext:PageManager ID="PageManager1" AjaxAspnetControls="Label1,Literal1" runat="server" />
2: <asp:Label ID="Label1" Text="Label1" runat="server"></asp:Label>
3: <br />
4: <asp:Literal ID="Literal1" Text="Literal1" runat="server"></asp:Literal>
5: <br />
6: <ext:Button ID="Button1" runat="server" Text="更新上面幾個文本值" OnClick="Button1_Click">
7: </ext:Button>
1: protected void Button1_Click(object sender, EventArgs e)
2: {
3: Label1.Text = "Label1 - " + DateTime.Now.ToLongTimeString();
4: Literal1.Text = "Literal1 - " + DateTime.Now.ToLongTimeString();
5: }
如果只看這段代碼,我們可能會想當然地以為asp:Label和asp:Literal在點擊按鈕時都被更新了,實際情況卻不是這樣:
為什么只有Label1的值得到更新,而Literal1沒有得到更新,看看生成的HTML源代碼,再想想FineUI的內部處理過程,你不難發現其中的奧秘。
生成的HTML源代碼:
1: <span id="Label1">Label1</span>
2: <br />
3: Literal1
4: <br />
5: <div id="Button1_wrapper"></div>
原來asp:Label和asp:Literal生成的HTML代碼的格式是不同的,asp:Literal生成的HTML代碼沒有外部的<span>標簽,怪不得FineUI不能通過ID值來查找Literal並更新它的HTML值,那么該怎么呢?
對於這種特殊情況,FineUI沒有打算費勁周折來讓Literal和Label的行為一致,而是提供了一個簡單的解決辦法(在Literal外面嵌套一層span或者div標簽):
是不是很好玩……
小結
每個頁面都需要一個PageManager控件,它提供了頁面級別的參數配置,可以用來覆蓋Web.config中的配置。不過最常到的可能是AutoSizePanelID屬性,用來將面板擴展到整個頁面。
下一篇文章我們會介紹最常用到的Button控件,FineUI為Button提供了非常豐富的功能。