[原創]FineUI秘密花園(四) — 頁面級別的配置


每一個使用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中的同名配置。

 

還有一些其他配置屬性:

  1. EnablePageLoading:是否啟用頁面第一次加載提示,默認為居中顯示的加載圖標(默認值:true)
  2. EnableAjaxLoading:是否啟用AJAX加載提示,默認為位於頁面上方的文字提示(默認值:true)
  3. 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,觀察生成的頁面源代碼,在最后你會看到這樣的腳本:

image

 

 

占據整個頁面的面板 - AutoSizePanelID屬性

這是一個你一定不會錯過的屬性,如果希望某個Panel、Window、Tree、TabStrip、RegionPanel或者Form占據整個頁面空間,就需要用到這個屬性,還是看看示例站點的寫法:

 

image

 

 

讓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請求,能夠很清楚的看到如下交互過程:

image

image

 

 

太棒了太棒了太棒了

如果你能理解上面提到的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在點擊按鈕時都被更新了,實際情況卻不是這樣:

image

為什么只有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標簽):

image

是不是很好玩……

 

 

小結

每個頁面都需要一個PageManager控件,它提供了頁面級別的參數配置,可以用來覆蓋Web.config中的配置。不過最常到的可能是AutoSizePanelID屬性,用來將面板擴展到整個頁面。

下一篇文章我們會介紹最常用到的Button控件,FineUI為Button提供了非常豐富的功能。

 

注:《FineUI秘密花園》系列文章由三生石上原創,博客園首發,轉載請注明出處。文章目錄 官方論壇


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM