程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> NBearV3教程——Web篇

NBearV3教程——Web篇

編輯:關於.NET

內容目錄

1、Helper Methods - 輔助Web常用方法

2、ClientScriptFactory - 輔助生成客戶端JS腳本

3、LoadResources()/GetString() - 多語言支持

4、AjaxHelper - 基於UserControl的AjaxHelper集成

從SF.NET下載NBear最新版本程序集、源碼及使用教程

0、重要說明

本文討論的內容只涉及NBear.Web這一個程序集,如果要在您自己的Web項目中使用本文所討論的功能,只需要添加到NBear.Web.dll的引用。NBear是一個基於.Net Framework 2.0/C# 2.0/ASP.NET 2.0的框架,因此,本文討論的內容只能用於ASP.NET 2.0開發。

本文只討論了NBear.Web中由NBear.Web.UI命名空間下的Page/MasterPage/UserControl這組擴展基類中定義的功能,因此,要在網頁中使用這些組件的功能,必須將這些類設為您的WebForm頁面,MasterPage頁面或User Control的基類。

由於為Page,MasterPage和UserControl這三個基類所作的擴展基本上是等價的,所以,本文下面的內容,主要演示對於Page這個基類的擴展功能,對於MasterPage和UserControl使用方法類似,只需保證使MasterPage和UserControl繼承相應的基類即可。

1、Helper Methods

示例代碼中的HelperMethodsDemo.aspx頁面演示了一組NBear.Web.UI.Page基類的擴展輔助方法。

1) GetIntParam()/GetStringParam()/GetDateTimeParam()。這組方法用於方便地獲取從QueryString和Form傳遞而來的參數。如果網頁包含相同鍵值的Form參數和QueryString參數,則優先返回Form參數。

下面的代碼簡單的使用這組函數,並輸出參數的值:

Response.Write(string.Format("intParam = {0}<br />", GetIntParam("intParam", 0)));
    Response.Write(string.Format("strParam = {0}<br />", GetStringParam("strParam", string.Empty)));
    Response.Write(string.Format("dtParam = {0}<br />", GetDateTimeParam("dtParam", DateTime.MinValue)));

注意,這組函數包含兩個參數,第二個參數指定默認的錯誤返回值,如果指定的鍵值不存在,或類型轉換失敗,則返回該錯誤返回值。

2) StrongTyped<IEntityType>()。該方法用於將一個任意類型的對象轉換為指定的強類型對象,從而簡化形如(ReturnType)obj這樣的語法。該方法尤其適合於用於頁面的數據綁定表達式中,代替基於反射的eval語法。

下面的示例將一個弱類型的Session值轉換為一個強類型的對象:

Session["hello time"] = DateTime.Now;

Response.Write(string.Format("Test StrongTyped&lt;T&gt;(), current time ticks = {0}<br />", StrongTyped<DateTime>(Session["hello time"]).Ticks));

3) TextToHtml()/ToXXXString()。這組方法幫助進行常見的字符串轉換。執行示例頁面可以看到其中兩個方法的演示,這裡就不列舉了。

2、ClientScriptFactory

可以通過 Page.ClientScriptFactory訪問一組用於生成客戶端JS腳本的服務端方法,包含了常見的一些JS代碼的構造封裝。在服務端構造客戶端JS的好處可以使得構造客戶端腳本的過程獲得編譯期的錯誤檢測,避免手寫JS代碼的一些不小心的不那麼容易調試的錯誤。

示例代碼中的ClientScriptFactoryDemo.aspx頁面演示了使用ClientScriptFactory的兩種典型場景。

一種是在aspx頁面中直接輸出腳本。例如:

<%= ClientScriptFactory.WrapScriptTag(ClientScriptFactory.PopAlert("Page Loaded")) %>

該語句將直接向頁面輸出一個<script>塊,包含一個alert效果。注意,如果不使用WrapScriptTag的話,自然生成的腳本就不會包含在一個script中,當在某一段script塊中插入部分JS片段時,不需包含WrapScriptTag。

第二種也是非常常見的使用方法,則是在頁面的某個Postback方法執行完畢後,直接在事件處理函數中Response一段腳本,給出一個客戶端提示。例如,下面的代碼在一個事件處理函數中輸出了一段相對復雜的客戶端JS腳本:

Response.Write(ClientScriptFactory.WrapScriptTag(string.Format("var result = {0}; if (result) {1} else {2}", ClientScriptFactory.PopConfirm("Are you sure?"), ClientScriptFactory.PopAlert("Yes"), ClientScriptFactory.PopAlert("No")), ClientScriptFactory.PopAlert("Done")));

3、LoadResources()/GetString()

這組方法提供了基於.resx和.resources資源文件,支持多語言網站構架的功能。Global.asax和GlobalizationDemo.aspx頁面演示了這組方法的使用。

注:ASP.NET 2.0本身就提供了很不錯的多語言支持方案,本組件中提供的可以作為另一個選擇,但是一般還是推薦使用ASP.NET 2.0默認提供的方案。

在Global.asax中的Application_Start事件中,初始化資源為一個默認語言:

void Application_Start(object sender, EventArgs e)
  {
    // Code that runs on application startup
    if (NBear.Web.UI.WebHelper.DefaultCulture.ToString().ToLower() != "en-us")
    {
      NBear.Web.UI.WebHelper.DefaultCulture = new System.Globalization.CultureInfo("zh-CN");
    }
    NBear.Web.UI.WebHelper.LoadResources("Strings");
  }

在GlobalizationDemo.aspx頁面中,包含了一個DropDownList用於更換指定語言的資源,同時使用GetString()輸出一個定義在資源文件中的Hello鍵值的文本資源。改變DropDownList中的語言選擇,將可以看到,頁面會顯示取自不同的資源文件的文本資源。

下面是頁面的code hehind,頁面載入時,設置當前的默認語言,並且在DropDownList的DropDownList1_SelectedIndexChanged事件處理中,在選擇的語言變化時,修改載入的資源:

public partial class GlobalizationDemo : NBear.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
    if (!IsPostBack)
    {
      for (int i = 0; i < DropDownList1.Items.Count; i++)
      {
        ListItem item = DropDownList1.Items[i];
        if (item.Value.ToLower() == NBear.Web.UI.WebHelper.DefaultCulture.ToString().ToLower())
        {
          DropDownList1.SelectedIndex = i;
        }
      }
    }
  }

  protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
  {
    NBear.Web.UI.WebHelper.DefaultCulture = new CultureInfo(DropDownList1.SelectedValue);
    NBear.Web.UI.WebHelper.LoadResources("Strings");
  }
}

那麼這些資源在哪裡定義的呢?

在ASP.NET 2.0下,資源文件一般需要定義在App_GlobalResources特別目錄中,當然實際上定義在別處也沒關系。我們的示例中,在這個目錄下定義了兩個resx文件Strings.en-US.resx和Strings.zh-CN.resx。分別對應中英文兩個語言。這兩個文件中都只包含了一個Hello鍵值及對應的文本內容。

另外,App_GlobalResources目錄中還包含了一個ResGen.cmd文件,這是一個批處理腳本,它用於簡化將resx編譯為.resources文件到bin目錄。必須將resx文件編譯為bin目錄下的.resources文件,才能被框架訪問到。ResGen.cmd文件的內容如下:

@echo off
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\resgen.exe" Strings.en-US.resx ..\bin\Strings.en-US.resources
"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\resgen.exe" Strings.zh-CN.resx ..\bin\Strings.zh-CN.resources

注意,如果要修改或添加資源項目,只需要修改resx文件,並重新點擊ResGen.cmd編譯資源文件即可,不需重新編譯整個網站程序。

4、AjaxHelper

AjaxHelper源自Teddy以前的一個同名Ajax框架。原來的實現基於對prototype這個開源Ajax實現的封裝,實現了ASP.NET下基於UserControl實現各種Ajax效果的功能。自動ASP.NET 2.0發布以後,Teddy已經將AjaxHelper完美集成到NBear中的擴展頁面基類中,並且使用ASP.NET 2.0內置的Callback機制代替原來的prototype依賴。

集成到NBear使得基於這個集成本版的AjaxHelper的使用更簡單優雅。

示例代碼中的AjaxDemo.aspx和AjaxDemo2.aspx這兩個頁面演示了集成到Page基類的Ajax功能的使用。

NBear中目前這個AjaxHelper支持兩中使用模式。

模式一,不支持浏覽器刷新模式。

所謂不支持浏覽器刷新指的是,在打開頁面,並以該模式執行了某些Ajax效果後,如果點擊浏覽器的刷新按鈕,或者按F5,頁面狀態會回復到初始載入狀態。

AjaxDemo.aspx頁面演示了該模式的Ajax回調的使用。

首先,只要使用AjaxHelper效果的頁面,必須重載EnableAjaxCallback屬性,並返回true,否則,頁面生成的代碼不會帶有用於Ajax回調的支持腳本,所有的Ajax效果都不會生效。可以在code behind中,象下面這樣重載EnableAjaxCallback屬性:

public partial class AjaxDemo : NBear.Web.UI.Page
{
  protected override bool EnableAjaxCallback
  {
    get
    {
      return true;
    }
  }
}
再來看AjaxDemo.aspx頁面的內容:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AjaxDemo.aspx.cs" Inherits="AjaxDemo" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
  <title>Untitled Page</title>
  <script language="javascript" type="text/javascript">
    function customFunc(data)
    {
      alert(data);
    }
  </script>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <input type="button" value="Test Callback" onclick="<%= Ajax.Callback("AjaxTemplates/Simple", null, "customFunc") %>" />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input type="button" value="Test Update" onclick="<%= Ajax.Update("AjaxTemplates/DataBinding", "outputElementId", "num=5", "customFunc") %>" />
    <br />
    <br />
    <div id="outputElementId"></div>
  </div>
  </form>
</body>
</html>

注意,頁面中定義了兩個按鈕,它們的onclick事件處理包含了Ajax調用代碼。

Ajax.Callback(string ajaxTemplate, string parms, string onComplete)

- 該方法將會執行一個對指定的ajaxTemplate的回調,可以通過parms傳遞形如"paramName1=1&paramName2=2"這樣的類似QueryString的參數,第三個參數onComplete是一個用於對回調返回的內容進行處理的客戶端腳本函數的名稱。

Ajax.Update(string ajaxTemplate, string outputElementId, string parms, string onComplete)

- 該方法和Ajax.Callback的區別是,它多了一個參數outputElementId,可以指定一個包含innerHTML屬性的標簽(如div,span等)的Id,回調成功的內容在交給onComlpete前,會被自動替換到outputElementId指定的標簽的innerHTML屬性內容。當然,也可以不指定onComplete參數,傳遞一個null就行。

注意,頁面中Ajax.Callback和Ajax.Update分別調用了兩個AjaxTemplate:Simple和DataBinding。這兩個AjaxTemplate實際上是兩個特殊的UserControl,它們定於AjaxTemplates目錄中。

所有的用作AjaxTemplate的User Control必須從NBear.Web.UI.AjaxTemplate類繼承。並且,如果要對頁面面內容進行code behind的處理,如進行數據綁定,不能在Page_Load中進行處理,而必須重載OnAjaxTemplatePreRender()方法進行處理。Page_Load中的代碼永遠不會被執行。

下面簡單列舉Simple和DataBinding的代碼。

注意Simple只在包含ascx頁面包含了一個簡單文本,不包含任何有效code behind代碼:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Simple.ascx.cs" Inherits="AjaxTemplates_Simple" %>
Hello Simple!

DataBinding在ascx頁面包含了一個空的GridView控件如下:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="DataBinding.ascx.cs" Inherits="AjaxTemplates_DataBinding" %>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>

同時DataBinding.ascx.cs這個code behind文件中,對GridView1綁定了一些數據,注意,我們重載了OnAjaxTemplatePreRender函數來執行綁定。另外,你可以看到,我們從OnAjaxTemplatePreRender的callbackParams參數中獲得了從AjaxDemo.aspx頁面的Button2傳遞過來的num參數。

public partial class AjaxTemplates_DataBinding : NBear.Web.UI.AjaxTemplate
{
  private SampleEntity[] objs = null;

  private void LoadSampleEntities(int num)
  {
    objs = new SampleEntity[num];

    for (int i = 0; i < num; i++)
    {
      objs[i] = EntityFactory<SampleEntity>.CreateObject();
      objs[i].ID = i + 1;
      objs[i].Name = Guid.NewGuid().ToString();
    }
  }

  public override void OnAjaxTemplatePreRender(System.Collections.Generic.Dictionary<string, string> callbackParams)
  {
    LoadSampleEntities(int.Parse(callbackParams["num"]));

    GridView1.DataSource = objs;
    GridView1.DataBind();
  }
}

模式二,支持浏覽器刷新模式。

相對於模式一,采用模式二時,浏覽器刷新時,之前的最後一次Ajax回調能夠被記憶,並在頁面載入後自動重新執行。

AjaxDemo2.aspx演示了采用模式二使用AjaxHelper的功能。

注意,AjaxDemo2.aspx和AjaxDemo.aspx的唯一不同只在於aspx文件,參見下面的AjaxDemo2.aspx的代碼:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AjaxDemo2.aspx.cs" Inherits="AjaxDemo2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
  <title>Untitled Page</title>
  <script language="javascript" type="text/javascript">
    function customFunc(data)
    {
      alert(data);
    }
  </script>
</head>
<body onload="<%= Ajax.OnPageLoad() %>">
  <form id="form1" runat="server">
  <div>
    <input type="button" value="Test Callback" onclick="<%= Ajax.Callback2("AjaxTemplates/Simple", null, "customFunc") %>" />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input type="button" value="Test Update" onclick="<%= Ajax.Update2("AjaxTemplates/DataBinding", "outputElementId", "num=5", "customFunc") %>" />
    <br />
    <br />
    <div id="outputElementId"></div>
  </div>
  </form>
</body>
</html>

和AjaxDemo.aspx頁面比較,您可以發現兩點細微的區別,請注意粗體的代碼。

第一點不同是,頁面的body標簽多了一個onload事件處理,這個事件處理的代碼的作用就是在頁面loaded之後,自動重新執行上一次模式二方式執行的Ajax回調。

第二點不同是,此時使用Ajax.Callback2和代替了模式一中的AjaxUpdate2,他們的參數列表和含義完全相同。

如果運行AjaxDemo2.aspx頁面,並點擊按鈕,您就會發現,在點擊按鈕的同時,頁面的地址欄部分會被附加一個#...的代碼,這裡就包含了上一次Ajax.Callback2或Ajax.Update2執行時的所有參數。Ajax.OnPageLoad()就是根據這些參數來重新執行上一次Ajax回調的。

實際上,模式一和模式二完全可以在同一個頁面混合使用,只需記住,只有Ajax.Callback2或Ajax.Update2執行的上一次(僅僅一次,在之前的Ajax回調是不記憶的)Ajax回調可以在頁面刷新時被自動重復執行。

//本文結束

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved