2016年1月3日 星期日

ASPX中使用ASPX.VB的Function

前言
有時我們會在GridView Template中使用CheckBox物件,Bind資料的Code如下,
,可是如果IS_OK欄位的值為DBNULL OR 空字串時,要如何處理呢?

實作

1.是在RowDataBound事件中去Find出該CheckBox物件,然後讀取資料處理後,再Assign給CheckBox's checked值。
2.使用一個Protected Function來處理,如下:
ASPX:

<asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# ProcBoolean(Eval("IS_OK")) %>' />
ASPX.VB:
protected function ProcBoolean(byval vValue as Object) as Boolean
  If (vValue Is DBNull.Value) = False Then
     '........ Your Logic....
 End If
     Return true 'or /false
end function
請注意哦! 那個Function的參數要用Object哦! 不然如果Bind進來的值是DBNull的話,會有錯誤哦!
另外,如果是ASP.NET 1.1的DataGrid中使用方式如下(回傳字串),
ASPX:
<asp:Label id="lblLevHR" runat="server" text='<%# ProcLevHour((Container.DataItem("LEVHR"))) %>' ></asp:Label>
ASPX.VB:
Protected Function ProcLevHour(ByVal vValue As Object) As String
    Dim result As String = String.Empty
    If (vValue Is DBNull.Value) = False Then
        '........ Your Logic....
    End If
    Return result
End Function

ASP.NET Web 網頁程式碼模型

ASP.NET Web 網頁是由兩部分組成:
  • 視覺項目,其中包含標記、伺服器控制項和靜態文字。
  • 網頁的程式設計邏輯,其中包含事件處理常式和其他程式碼。
ASP.NET 提供兩個模型以管理視覺項目和程式碼:單一檔案網頁模型和程式碼後置網頁模型。兩個模型的功能是相同的,並且您可以在兩個模型上使用相同的控制項和程式碼。

在單一檔案網頁模型中,網頁的標記和程式碼都在相同的實體 .aspx 檔中。程式設計碼是在包含 runat="server" 屬性的 script 區塊中,以便讓其成為 ASP.NET 要執行的程式碼。
下列程式碼範例,示範了包含 Button 和 Label 控制項的單一檔案網頁。反白顯示的部分顯示 script 區塊中 Button 控制項的 Click 事件處理常式
script區塊可以包含網頁所需的任何程式碼數量。程式碼可以由網頁上控制項的事件處理常式 (如同在這個範例中)、方法、屬性,以及在類別檔中通常會使用的任何其他程式碼所組成。在執行階段時,單一檔案網頁會被視為衍生自 Page 類別的類別。這個網頁並未包含明確類別宣告,而是由編譯器產生包含控制項做為成員的新類別 (並非所有控制項都會公開做為網頁成員。某些控制項是其他控制項的子系)。網頁中的程式碼會變成類別的一部分。例如,您建立的事件處理常式會變成衍生 Page 類別的成員。
<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Button1_Click(ByVal sender As Object, _ByVal e As System.EventArgs)
Label1.Text = "Clicked at " & DateTime.Now.ToString()    
End Sub
</script>

<html>
<head id="Head1" runat="server">
  <title>Single-File Page Model</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      <asp:Label ID="Label1" 
        runat="server" Text="Label">
      </asp:Label>
      <asp:Button ID="Button1" 
         runat="server" OnClick="Button1_Click" Text="Button">
      </asp:Button>
    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" %>
<script runat="server">
void Button1_Click(Object sender, EventArgs e)
{
Label1.Text = "Clicked at " + DateTime.Now.ToString();
}
</script>
<html>
<head>
  <title>Single-File Page Model</title>
</head>
<body>
  <form runat="server">
    <div>
       <asp:Label id="Label1" 
         runat="server" Text="Label">
       </asp:Label>
       <br />
       <asp:Button id="Button1" 
         runat="server" 
         onclick="Button1_Click" 
         Text="Button">
      </asp:Button>
    </div>
  </form>
</body>
</html>

程式碼後置網頁模型可以讓您將標記放在單一檔案 (.aspx 檔),並且將程式碼放在另一個檔案。程式碼檔案的名稱會根據您使用的程式設計語言而有所不同。
015103yb.alert_note(zh-tw,VS.100).gif注意事項:
並非所有的 .NET 程式設計語言,都可以讓您建立 ASP.NET Web 網頁的程式碼後置檔案。語言必須支援 partial 類別。例如,J# 不支援 partial 類別,因此不支援建立 ASP.NET 網頁的程式碼後置檔案。
例如,如果您使用名為 SamplePage 的網頁,則標記會在 SamplePage.aspx 檔,程式會在名為 SamplePage.aspx.vb (Visual Basic) 或 SamplePage.aspx.cs (C#) 等檔案中。
015103yb.alert_note(zh-tw,VS.100).gif注意事項:
.NET Framework 2.0 版中使用的程式碼後置模型與舊版中使用的不同。
在程式碼後置模型中,之前章節中所使用的單一檔案網頁範例可以分為兩部分。標記會在一個檔案中 (在這個範例中是 SamplePage.aspx) 並且類似單一檔案網頁,如同下列程式碼範例所示
程式碼後置檔案在預設命名空間中包含完整的類別宣告。然而,類別是使用 partial 關鍵字宣告,表示類別並非完全包含在單一檔案中。而是在網頁執行時,編譯器會讀取 .aspx 網頁以及在 @ Page 指示詞中參考的檔案、將其組成單一類別,然後編譯為單一類別的單元。
partial 類別檔會繼承自網頁 Page 類別
<%@ Page Language="VB" CodeFile="SamplePage.aspx.vb" 
    Inherits="SamplePage" AutoEventWire="false" %>
<html>
<head runat="server" >
   <title>Code-Behind Page Model</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
       <asp:Label id="Label1" 
         runat="server" Text="Label" >
      </asp:Label>
      <br />
      <asp:Button id="Button1" 
         runat="server" 
         onclick="Button1_Click" 
         Text="Button" >
       </asp:Button>
    </div>
  </form>
</body>

Partial Class SamplePage
    Inherits System.Web.UI.Page
    Protected Sub Button1_Click(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = "Clicked at " & DateTime.Now.ToString()
    End Sub
End Class

<%@ Page Language="C#" CodeFile="SamplePage.aspx.cs" 
    Inherits="SamplePage" AutoEventWireup="true" %>
<html>
<head runat="server" >
   <title>Code-Behind Page Model</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
       <asp:Label id="Label1" 
         runat="server" Text="Label" >
      </asp:Label>
      <br />
      <asp:Button id="Button1" 
         runat="server" 
         onclick="Button1_Click" 
         Text="Button" >
       </asp:Button>
    </div>
  </form>
</body>
</html>
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class SamplePage : System.Web.UI.Page
{
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "Clicked at " + DateTime.Now.ToString();
    }
}


單一檔案和程式碼後置網頁模型的功能相同。在執行階段,模型的執行方式相同,並且兩者之間並沒有效能上的差異。因此選擇網頁模型是依照其他因素而定,例如應用程式中程式碼的組織方式、分開網頁設計和程式碼是否很重要等因素。
015103yb.alert_note(zh-tw,VS.100).gif注意事項:
在文件中讀取的範例通常會以單一檔案網頁表示。這主要是為了方便讀者,因為如此就不需要說明每個範例的兩種檔案。在文件中發現單一檔案範例的事實,並不能解釋為偏好單一檔案網頁而不是程式碼後置網頁,也不代表單一檔案網頁有某些其他先天優勢。

單一檔案網頁的優點

一般而言,如果網頁的程式碼主要是由網頁上控制項的事件處理常式所組成,則適合使用單一檔案模型。
單一檔案網頁模型的優點如下列所示:
  • 在程式碼不多的網頁中,將程式碼和標記放在相同檔案中的便利性,將超越程式碼後置模型的其他優點。例如,因為您可以在同一個地方看到程式碼和標記,就比較容易學習單一檔案網頁。
  • 因為只有一個檔案,所以使用單一檔案模型撰寫的網頁比較容易部署,或傳送至其他程式設計人員。
  • 因為檔案之間沒有相依性,所以單一檔案網頁較容易重新命名。
  • 因為網頁獨立於單一檔案中,所以管理原始程式碼控制系統中的檔案會比較容易。

程式碼後置網頁的優點

程式碼後置網頁提供的優勢,可以適用於使用大量程式碼的 Web 應用程式,或是多個開發人員在建立網站的情況
程式碼後置模型的優點如下列所示:
  • 程式碼後置網頁可以清楚分隔標記 (使用者介面) 和程式碼。如果在程式設計人員撰寫程式碼的同時,可以讓設計人員處理標記就很實用。
  • 程式碼不會公開給網頁設計人員或是只使用網頁標記的其他人員。
  • 多個網頁可以重複使用程式碼。

單一檔案和程式碼後置網頁的編譯與部署方式類似。最簡單的方式是將網頁複製到目標伺服器。如果您使用程式碼後置網頁,就要同時複製 .aspx 網頁和程式碼檔案。當首次要求網頁時,ASP.NET 會編譯並執行網頁。請注意在兩種情況下您都要使用標記部署原始程式碼。
此外,您也可以先行編譯網站。在這種情況下,ASP.NET 會產生網頁的物件程式碼,讓您複製到目標伺服器。單一檔案和程式碼後置模型都能夠使用先行編譯,並且兩種模型的輸出都相同