使用 Razor 語法 ASP.NET Web 程式設計簡介 (Visual Basic)

作者:Tom FitzMacken

本文提供使用 Razor 語法和 Visual Basic ASP.NET Web Pages進行程式設計的概觀。 ASP.NET 是 Microsoft 在網頁伺服器上執行動態網頁的技術。

您將瞭解的內容

  • 使用 Razor 語法開始使用程式設計 ASP.NET Web Pages的前 8 大程式設計秘訣。
  • 您需要的基本程式設計概念。
  • ASP.NET 伺服器程式碼和 Razor 語法有關。

軟體版本

  • ASP.NET Web Pages (Razor) 3

本教學課程也適用于 ASP.NET Web Pages 2。

使用 ASP.NET Web Pages 與 Razor 語法的大部分範例都使用 C#。 但 Razor 語法也支援 Visual Basic。 若要在 Visual Basic 中設計 ASP.NET 網頁,您可以建立副檔名 為 .vbhtml 的網頁,然後新增 Visual Basic 程式碼。 本文提供使用 Visual Basic 語言和語法來建立 ASP.NET 網頁的概觀。

注意

C# 和 Visual Basic 版本中提供 Microsoft WebMatrix ( (][相片圖庫] 和 [入門網站] ) 等的預設網站範本。 您可以將 Visual Basic 範本安裝為 NuGet 套件。 網站範本會安裝在您網站的根資料夾中,名為 Microsoft Templates的資料夾。

前 8 大程式設計秘訣

本節列出當您開始使用 Razor 語法撰寫 ASP.NET 伺服器程式碼時,絕對需要知道的一些秘訣。

1.您可以使用 @ 字元將程式碼新增至頁面

字元會 @ 啟動內嵌運算式、單一語句區塊和多重語句區塊:

<!-- Single statement blocks  -->
@Code  Dim total = 7  End Code
@Code  Dim myMessage = "Hello World" End Code

<!-- Inline expressions -->
<p>The value of your account is: @total </p>
<p>The value of myMessage is: @myMessage</p>        
    
<!-- Multi-statement block -->    
@Code 
    Dim greeting = "Welcome to our site!"
    Dim weekDay = DateTime.Now.DayOfWeek
    Dim greetingMessage = greeting & " Today is: " & weekDay.ToString()
End Code 
<p>The greeting is: @greetingMessage</p>

在瀏覽器中顯示的結果:

Razor-Img1

提示

HTML 編碼

當您使用 @ 字元在頁面中顯示內容時,如上述範例所示,ASP.NET HTML 編碼輸出。 這會以程式碼取代保留的 HTML 字元 (,例如 <>&) ,讓字元在網頁中顯示為字元,而不是解譯為 HTML 標籤或實體。 如果沒有 HTML 編碼,伺服器程式碼的輸出可能無法正確顯示,而且可能會讓頁面暴露在安全性風險中。

如果您的目標是輸出 HTML 標籤,將標記轉譯為標記 (例如 <p></p> 段落或 <em></em> 強調文字) ,請參閱本文稍後 在程式碼區塊中結合文字、標記和程式碼 一節。

您可以在ASP.NET Web Pages 網站中使用 HTML Forms中深入瞭解 HTML 編碼。

2.您用程式碼括住程式碼區塊...結束代碼

程式碼區塊包含一或多個程式碼語句,並以 關鍵字 CodeEnd Code 括住。 將 open Code 關鍵字緊接在字元後面 @ — 它們之間不能有空白字元。

<!-- Single statement block.  -->
@Code
    Dim theMonth = DateTime.Now.Month
End Code
<p>The numeric value of the current month: @theMonth</p>

<!-- Multi-statement block. -->
@Code
    Dim outsideTemp = 79
    Dim weatherMessage = "Hello, it is " & outsideTemp & " degrees."
End Code 
<p>Today's weather: @weatherMessage</p>

在瀏覽器中顯示的結果:

Razor-Img2

3.在 區塊內,您會以分行符號結束每個程式碼語句

在 Visual Basic 程式碼區塊中,每個語句的結尾都是分行符號。 (稍後的文章中,您將視需要看到將長程式碼語句包裝成多行的方法。)

<!-- Single statement block. -->
@Code
    Dim theMonth = DateTime.Now.Month
End Code

<!-- Multi-statement block. -->
@Code
    Dim outsideTemp = 79
    Dim weatherMessage = "Hello, it is " & outsideTemp & " degrees."
End Code 

<!-- An inline expression, so no line break needed. -->
<p>Today's weather: @weatherMessage</p>

4.您可以使用變數來儲存值

您可以將值儲存在 變數中,包括字串、數位和日期等。您可以使用 關鍵字建立新的變數 Dim 。 您可以使用 直接在頁面中 @ 插入變數值。

<!-- Storing a string -->
@Code 
    Dim welcomeMessage = "Welcome, new members!"
End Code
<p>@welcomeMessage</p>
    
<!-- Storing a date -->
@Code 
    Dim year = DateTime.Now.Year
End Code

<!-- Displaying a variable -->
<p>Welcome to our new members who joined in @year!</p>

在瀏覽器中顯示的結果:

Razor-Img3

5.您會以雙引號括住常值字串值

字串是被視為文字的字元序列。 若要指定字串,請將它括在雙引號中:

@Code 
    Dim myString = "This is a string literal"
End Code

若要在字串值內嵌雙引號,請插入兩個雙引號字元。 如果您想要在頁面輸出中出現一次雙引號字元,請在加上引號的字串中輸入它 "" ,而且如果您想要顯示兩次,請在加上引號的字串中輸入 """" 它。

<!-- Embedding double quotation marks in a string -->
@Code 
    Dim myQuote = "The person said: ""Hello, today is Monday."""
End Code
<p>@myQuote</p>

在瀏覽器中顯示的結果:

Razor-Img4

6.Visual Basic 程式碼不區分大小寫

Visual Basic 語言不區分大小寫。 程式設計關鍵字 (例如 DimIfTrue) 和 變數名稱 (, myStringsubTotal) 都可以在任何情況下寫入。

下列幾行程式碼會使用小寫名稱將值指派給變數 lastname ,然後使用大寫名稱將變數值輸出至頁面。

@Code 
    Dim lastName = "Smith"
    ' Keywords like dim are also not case sensitive.
    DIM someNumber = 7
End Code
<p>The value of the <code>lastName</code> variable is: @LASTNAME</p>

在瀏覽器中顯示的結果:

vb-syntax-5

7.您的大部分程式碼都牽涉到使用物件

物件代表您可以使用的程式設計專案:頁面、文字方塊、檔案、影像、Web 要求、電子郵件訊息、客戶記錄 (資料庫資料列) 等等。物件具有描述其特性的屬性— 文字方塊物件具有 Text 屬性、要求物件具有 Url 屬性、電子郵件訊息具有 From 屬性,而客戶物件具有 FirstName 屬性。 物件也有可以執行的「動詞命令」方法。 範例包括檔案物件的 Save 方法、影像物件的 Rotate 方法,以及電子郵件物件的 Send 方法。

您通常會使用 Request 物件,其會提供資訊,例如頁面上的表單欄位值, (文字方塊等等。) 、提出要求的瀏覽器類型、頁面的 URL、使用者身分識別等。此範例示範如何存取 物件的屬性 Request ,以及如何呼叫 MapPath 物件的 方法 Request ,這可讓您在伺服器上提供頁面的絕對路徑:

<table border="1"> 
    <tr>
        <td>Requested URL</td>
        <td>Relative Path</td>
        <td>Full Path</td>
        <td>HTTP Request Type</td>
    </tr>
    <tr>
        <td>@Request.Url</td>
        <td>@Request.FilePath</td>
        <td>@Request.MapPath(Request.FilePath)</td>
        <td>@Request.RequestType</td>
    </tr>
</table>

在瀏覽器中顯示的結果:

Razor-Img5

8.您可以撰寫程式碼來做出決策

動態網頁的主要功能是您可以根據條件來判斷要執行的動作。 最常見的做法是 If 語句 (和選擇性 Else 語句) 。

@Code
   Dim result = ""
   If IsPost Then
      result = "This page was posted using the Submit button."
   Else
      result = "This was the first request for this page."
   End If
End Code
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Write Code that Makes Decisions</title>
    </head>
<body>
    
    <form method="POST" action="" >
        <input type="Submit" name="Submit" value="Submit"/>
        <p>@result</p>
    </form>
    
</body>
</html>

語句 If IsPost 是撰寫 If IsPost = True 的速記方式。 除了 If 語句之外,還有各種方法來測試條件、重複程式碼區塊等等,本文稍後會加以說明。

按一下 [ 提交 ]) 之後,瀏覽器 (中顯示的結果:

Razor-Img6

提示

HTTP GET 和 POST 方法和 IsPost 屬性

HTTP) (網頁所使用的通訊協定支援非常有限的方法, (「動詞」) ,用來對伺服器提出要求。 最常見的兩個是 GET,用來讀取頁面,以及用來提交頁面的 POST。 一般而言,使用者第一次要求頁面時,會使用 GET 要求頁面。 如果使用者填寫表單,然後按一下 [ 提交],瀏覽器就會向伺服器提出 POST 要求。

在 Web 程式設計中,通常最好知道頁面是以 GET 或 POST 的形式要求,以便您知道如何處理頁面。 在 ASP.NET Web Pages中,您可以使用 IsPost 屬性來查看要求是 GET 或 POST。 如果要求是 POST, IsPost 屬性會傳回 true,而且您可以執行類似讀取表單上文字方塊值之類的動作。 您會看到許多範例示範如何根據 的值 IsPost ,以不同的方式處理頁面。

簡單的程式碼範例

此程式說明如何建立說明基本程式設計技術的頁面。 在此範例中,您會建立一個頁面,讓使用者輸入兩個數字,然後新增它們並顯示結果。

  1. 在您的編輯器中,建立新的檔案,並將它命名為 AddNumbers.vbhtml

  2. 將下列程式碼和標記複製到頁面中,取代頁面中已有的任何專案。

    @Code
        Dim total = 0
        Dim totalMessage = ""
        if IsPost Then
            ' Retrieve the numbers that the user entered.
            Dim num1 = Request("text1")
            Dim num2 = Request("text2")
            ' Convert the entered strings into integers numbers and add.
            total = num1.AsInt() + num2.AsInt()
            totalMessage = "Total = " & total
        End If
    End Code
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8" />
            <title>Adding Numbers</title>
            <style type="text/css">
                body {background-color: beige; font-family: Verdana, Ariel; 
                    margin: 50px;
                    }
                form {padding: 10px; border-style: solid; width: 250px;}
            </style>
        </head>
    <body>
        <p>Enter two whole numbers and click <strong>Add</strong> to display the result.</p>
        <p></p>
        <form action="" method="post">
        <p><label for="text1">First Number:</label>
        <input type="text" name="text1" />
        </p>
        <p><label for="text2">Second Number:</label>
        <input type="text" name="text2" />
        </p>
        <p><input type="submit" value="Add" /></p>
        </form>
        <p>@totalMessage</p>
    </body>
    </html>
    

    以下是一些值得注意的事項:

    • @字元會啟動頁面的第一個程式碼區塊,並在靠近底部的變數前面 totalMessage
    • 頁面頂端的 區塊會包含在 中 Code...End Code
    • 變數 totalnum1num2totalMessage 會儲存數個數字和字串。
    • 指派給變數的 totalMessage 常值字串值會以雙引號括住。
    • 因為 Visual Basic 程式碼不區分大小寫,所以當 totalMessage 變數在頁面底部附近使用時,其名稱只需要比對頁面頂端的變數宣告拼字。 大小寫並不重要。
    • 運算式 num1.AsInt() + num2.AsInt() 示範如何使用 物件和方法。 每個 AsInt 變數上的 方法會將使用者輸入的字串轉換成整數, (可加入的整數) 。
    • <form> 標包含 method="post" 屬性。 這會指定當使用者按一下 [ 新增] 時,頁面將會使用 HTTP POST 方法傳送至伺服器。 提交頁面時,程式碼 If IsPost 會評估為 true,並執行條件式程式碼,以顯示新增數位的結果。
  3. 儲存頁面並在瀏覽器中執行。 (在 [ 檔案 ] 工作區中選取頁面,再執行它。) 輸入兩個整數,然後按一下 [ 新增 ] 按鈕。

    Razor-Img7

Visual Basic 語言和語法

稍早您已瞭解如何建立 ASP.NET 網頁的基本範例,以及如何將伺服器程式碼新增至 HTML 標籤。 在這裡,您將瞭解使用 Visual Basic 撰寫 ASP.NET 伺服器程式碼的基本概念,也就是程式設計語言規則。

如果您遇到程式設計 (,特別是如果您使用 C、C++、C#、Visual Basic 或 JavaScript) ,您在這裡閱讀的大部分內容都會很熟悉。 您可能只需要熟悉將 WebMatrix 程式碼新增至 .vbhtml 檔案中的標記的方式。

在程式碼區塊中合併文字、標記和程式碼

在伺服器程式碼區塊中,您通常會想要將文字和標記輸出至頁面。 如果伺服器程式碼區塊包含不是程式碼的文字,而該文字應該轉譯為原狀,ASP.NET 必須能夠區分該文字與程式碼。 有數種方法能完成這項操作。

  • 將文字括在 HTML 區塊元素中,例如 <p></p><em></em>

    @If IsPost Then
        ' This line has all content between matched <p> tags.
        @<p>Hello, the time is @DateTime.Now and this page is a postback!</p> 
    Else
        ' All content between matched tags, followed by server code.
        @<p>Hello, <em>Stranger!</em> today is: </p> @DateTime.Now
    End If
    

    HTML 元素可以包含文字、其他 HTML 元素和伺服器程式碼運算式。 ASP.NET 看到開頭的 HTML 標籤 (例如, <p>) ,它會將元素及其內容轉譯為瀏覽器 (,並解析伺服器程式碼運算式) 。

  • @:使用 運算子或 <text> 專案。 會 @: 輸出包含純文字或不相符 HTML 標籤的單行內容; <text> 專案會括住多行以輸出。 當您不想將 HTML 元素轉譯為輸出的一部分時,這些選項很有用。

    @If IsPost Then
        ' Plain text followed by an unmatched HTML tag and server code.
        @:The time is: <br /> @DateTime.Now
        ' Server code and then plain text, matched tags, and more text.
        @DateTime.Now @:is the <em>current</em> time.
    End If
    

    下列範例會重複上述範例,但會使用單一標記組 <text> 來括住文字來轉譯。

    @If IsPost Then
        @<text>
        The time is: <br /> @DateTime.Now
        @DateTime.Now is the <em>current</em> time.
        </text>
    End If
    

    在下列範例中 <text> ,和 </text> 標記會括住三行,其中所有的文字和不相符的 HTML 卷 <br /> 標 () ,以及伺服器程式碼和相符的 HTML 標籤。 同樣地,您也可以個別在每一行前面加上 @: 運算子;任一種方式都可以運作。

    @Code
        dim minTemp = 75 
        @<text>It is the month of @DateTime.Now.ToString("MMMM"), and  
        it's a <em>great</em> day! <p>You can go swimming if it's at 
        least @minTemp degrees.</p></text>
    End Code
    

    注意

    當您輸出如本節所示的文字時,請使用 HTML 元素、 @: 運算子或 <text> 元素 ,ASP.NET 不會以 HTML 編碼輸出。 (如先前所述,ASP.NET 會編碼伺服器程式碼運算式的輸出,以及前面 @ 加上 的伺服器程式碼區塊,但本節中所述的特殊案例除外。)

空白

語句中的額外空格 (和字串常值外部) 不會影響 語句:

@Code Dim personName =    "Smith"    End Code

將 long 語句分成多行

您可以使用 Visual Basic 中的底線字元 (在每行程式碼之後呼叫接續字元_) ,將長程式碼語句分成多行。 若要將 語句中斷至下一行,在行尾處新增空格,然後加上接續字元。 在下一行繼續 語句。 您可以視需要將 語句包裝到許多行上,以改善可讀性。 下列陳述式是相同的:

@Code
    Dim familyName _
    =  "Smith" 
End Code

@Code
    Dim _
    theName _
    = _
    "Smith"
End Code

不過,您無法在字串常值中間換行。 下列範例無法運作:

@Code 
    ' Doesn't work.
    Dim test = "This is a long _
      string"
End Code

若要結合包裝成多個行的長字串,例如上述程式碼,您必須使用 串連運算子 () & ,本文稍後將會看到。

程式碼批註

批註可讓您自行或其他人留下筆記。 Razor 語法批註前面加上 , @* 結尾為 *@

@* A single-line comment is added like this example. *@
    
@*
    This is a multiline code comment. 
    It can continue for any number of lines.
*@

在程式碼區塊中,您可以使用 Razor 語法批註,或使用一般的 Visual Basic 批註字元,這是 () 前面加上每一行的引號 '

@Code
    ' You can make comments in blocks by just using ' before each line.
End Code
    
@Code
    ' There is no multi-line comment character in Visual Basic. 
    ' You use a ' before each line you want to comment. 
End Code

變數

變數是用來儲存資料的具名物件。 您可以將變數命名為任何專案,但名稱開頭必須是字母字元,而且不能包含空白字元或保留字元。 在 Visual Basic 中,如先前所見,變數名稱中的字母大小寫並不重要。

變數和資料類型

變數可以有特定的資料類型,這表示變數中儲存的資料類型。 您可以有字串變數來儲存字串值 (,例如 「Hello world」) 、儲存整數值的整數變數 (例如 3 或 79) ,以及以各種格式儲存日期值的日期變數 (,例如 4/12/2012 或 2009 年 3 月) 。 而且有許多其他資料類型可供您使用。

不過,您不需要指定變數的類型。 在大部分情況下,ASP.NET 可以根據變數中的資料使用方式來找出類型。 (您偶爾必須指定類型;您會看到範例,其中這是 true.)

若要宣告變數而不指定類型,請使用 Dim 加上變數名稱 (,例如 Dim myVar ,) 。 若要宣告具有類型的變數,請使用 Dim 加上變數名稱,後面接著 As ,然後 (例如, Dim myVar As String) 。

@Code
    ' Assigning a string to a variable.
    Dim greeting = "Welcome" 
    
    ' Assigning a number to a variable.
    Dim theCount = 3
    
    ' Assigning an expression to a variable.
    Dim monthlyTotal = theCount + 5
    
    ' Assigning a date value to a variable.
    Dim today = DateTime.Today
    
    ' Assigning the current page's URL to a variable.
    Dim myPath = Request.Url
    
    ' Declaring variables using explicit data types.
    Dim name as String = "Joe"
    Dim count as Integer = 5
    Dim tomorrow as DateTime = DateTime.Now.AddDays(1)
End Code

下列範例顯示一些使用網頁中變數的內嵌運算式。

@Code
    ' Embedding the value of a variable into HTML markup.
    ' Precede the markup with @ because we are in a code block.
    @<p>@greeting, friends!</p>
End Code

<!-- Using a variable with an inline expression in HTML. --> 
<p>The predicted annual total is: @( monthlyTotal * 12)</p>

<!--  Displaying the page URL with a variable. --> 
<p>The URL to this page is:  @myPath</p>

在瀏覽器中顯示的結果:

Razor-Img9

轉換和測試資料類型

雖然 ASP.NET 通常可以自動判斷資料類型,但有時無法。 因此,您可能需要藉由執行明確轉換來協助 ASP.NET。 即使您不需要轉換類型,有時測試還是會協助您查看您可能正在使用的資料類型。

最常見的情況是您必須將字串轉換成另一種類型,例如整數或日期。 下列範例顯示一般案例,其中您必須將字串轉換成數位。

@Code
    Dim total = 0
    Dim totalMessage = ""
    if IsPost Then
        ' Retrieve the numbers that the user entered.
        Dim num1 = Request("text1")
        Dim num2 = Request("text2")
        ' Convert the entered strings into integers numbers and add.
        total = num1.AsInt() + num2.AsInt()
        totalMessage = "Total = " & total
    End If
End Code

根據規則,使用者輸入會以字串的形式帶給您。 即使您已提示使用者輸入數位,即使他們已輸入數位,在提交使用者輸入且以程式碼讀取時,資料仍會以字串格式顯示。 因此,您必須將字串轉換成數位。 在此範例中,如果您嘗試在值上執行算術而不轉換它們,則會產生下列錯誤結果,因為 ASP.NET 無法新增兩個字串:

Cannot implicitly convert type 'string' to 'int'.

若要將值轉換成整數,請呼叫 AsInt 方法。 如果轉換成功,您可以接著新增數位。

下表列出變數的一些常見轉換和測試方法。

方法

描述

範例


AsInt(), IsInt()

將代表整數 (的字串,例如 「593」) 轉換為整數。

Dim myIntNumber = 0
Dim myStringNum = "539"
If myStringNum.IsInt() Then
    myIntNumber = myStringNum.AsInt()
End If

AsBool(), IsBool()

將 「true」 或 「false」 之類的字串轉換成布林類型。

Dim myStringBool = "True"
Dim myVar = myStringBool.AsBool()

AsFloat(), IsFloat()

將具有十進位值的字串,例如 「1.3」 或 「7.439」 轉換為浮點數。

Dim myStringFloat = "41.432895"
Dim myFloatNum = myStringFloat.AsFloat()

AsDecimal(), IsDecimal()

將具有十進位值的字串,例如 「1.3」 或 「7.439」 轉換為十進位數。 (在 ASP.NET 中,小數位比浮點數更精確。)

Dim myStringDec = "10317.425"
Dim myDecNum = myStringDec.AsDecimal()

AsDateTime(), IsDateTime()

將代表日期和時間值的字串轉換為 ASP.NET DateTime 類型。

Dim myDateString = "12/27/2012"
Dim newDate = myDateString.AsDateTime()

ToString()

將任何其他資料類型轉換成字串。

Dim num1 As Integer = 17
Dim num2 As Integer = 76

' myString is set to 1776
Dim myString as String = num1.ToString() & _
    num2.ToString()

運算子

運算子是一個關鍵字或字元,可告訴 ASP.NET 在運算式中執行的命令類型。 Visual Basic 支援許多運算子,但您只需要辨識幾個來開始開發 ASP.NET 網頁。 下表摘要說明最常見的運算子。

運算子

描述

範例


+ - * /

數值運算式中使用的數學運算子。

@(5 + 13)

Dim netWorth = 150000
Dim newTotal = netWorth * 2
@(newTotal / 2)

=

指派和相等。 視內容而定,將語句右側的值指派給左邊的物件,或檢查值是否相等。

Dim age = 17

Dim income = Request("AnnualIncome")

<>

不等。 如果值不相等,則傳 True 回 。

Dim theNum = 13
If theNum <> 15 Then
    ' Do something.
End If

< > <= >=

小於、大於、小於或等於,以及大於或等於。

If 2 < 3 Then
    ' Do something.
End If

Dim currentCount = 12
If currentCount >= 12 Then
    ' Do something.
End If

&

串連,用來聯結字串。

' The displayed result is "abcdef".
@("abc" & "def")

+= -=

遞增和遞減運算子,分別從變數中新增和減去 1) (。

Dim theCount As Integer = 0
theCount += 1 ' Adds 1 to count

.

點。 用來區別物件及其屬性和方法。

Dim myUrl = Request.Url
Dim count = Request("Count").AsInt()

()

括弧。 用來將運算式分組、將參數傳遞至方法,以及存取陣列和集合的成員。

@(3 + 7)

@Request.MapPath(Request.FilePath)

Not

不是。 將 true 值反轉為 false,反之亦然。 通常用來作為測試 (的速記方式 False ,也就是不 True) 。

Dim taskCompleted As Boolean = False
' Processing.
If Not taskCompleted Then 
    ' Continue processing
End If

AndAlso OrElse

邏輯 AND 和 OR,用來將條件連結在一起。

Dim myTaskCompleted As Boolean = false
Dim totalCount As Integer = 0          
' Processing.
If (Not myTaskCompleted) AndAlso _
         totalCount < 12 Then 
    ' Continue processing.
End If

在程式碼中使用檔案和資料夾路徑

您通常會在程式碼中使用檔案和資料夾路徑。 以下是網站的實體資料夾結構範例,因為它可能會出現在您的開發電腦上:

C:\WebSites\MyWebSite default.cshtml datafile.txt \images Logo.jpg \styles Styles.css

以下是 URL 和路徑的一些基本詳細資料:

  • URL 的開頭為功能變數名稱 (http://www.example.com) 或伺服器名稱 () http://localhosthttp://mycomputer
  • URL 對應至主機電腦上的實體路徑。 例如, http://myserver 可能會對應至伺服器上的 C:\websites\mywebsite 資料夾。
  • 虛擬路徑是簡短的,表示程式碼中的路徑,而不需要指定完整路徑。 它包含 URL 後面的部分網域或伺服器名稱。 當您使用虛擬路徑時,您可以將程式碼移至不同的網域或伺服器,而不需要更新路徑。

以下是協助您瞭解差異的範例:

完成 URL http://mycompanyserver/humanresources/CompanyPolicy.htm
伺服器名稱 mycompanyserver
虛擬路徑 /humanresources/CompanyPolicy.htm
實體路徑 C:\mywebsites\humanresources\CompanyPolicy.htm

虛擬根目錄是 /,就像 C: 磁片磁碟機的根目錄是 一樣。 (虛擬資料夾路徑一律使用正斜線。) 資料夾的虛擬路徑不一定要有與實體資料夾相同的名稱;它可以是別名。 (在生產伺服器上,虛擬路徑很少符合確切的實體路徑。)

當您在程式碼中使用檔案和資料夾時,有時您需要參考實體路徑,有時需要參考虛擬路徑,視您使用的物件而定。 ASP.NET 提供這些工具,讓您在程式碼中使用檔案和資料夾路徑: Server.MapPath 方法,以及 ~ 運算子和 Href 方法。

將虛擬轉換為實體路徑:Server.MapPath 方法

方法 Server.MapPath 會將虛擬路徑 (,例如 /default.cshtml) 轉換為絕對實體路徑 (,例如 C:\WebSites\MyWebSiteFolder\default.cshtml) 。 每當您需要完整的實體路徑時,就會使用此方法。 典型的範例是當您在網頁伺服器上讀取或寫入文字檔或影像檔時。

您通常不知道主控月臺伺服器上的月臺絕對實體路徑,因此這個方法可以將您知道的路徑—虛擬路徑— 轉換為伺服器上的對應路徑。 您將虛擬路徑傳遞至檔案或資料夾至 方法,並傳回實體路徑:

@Code
    Dim dataFilePath = "~/dataFile.txt"
End Code    

<!-- Displays a physical path C:\Websites\MyWebSite\datafile.txt  --> 
<p>@Server.MapPath(dataFilePath)</p>

參考虛擬根目錄:~ 運算子和 Href 方法

.cshtml.vbhtml 檔案中,您可以使用 運算子參考虛擬根路徑 ~ 。 這非常有用,因為您可以在網站中移動頁面,而且其包含至其他頁面的任何連結都不會中斷。 如果您曾經將網站移至不同的位置,也很方便。 以下是一些範例:

@Code
    Dim myImagesFolder = "~/images"
    Dim myStyleSheet = "~/styles/StyleSheet.css"       
End Code

如果網站是 http://myserver/myapp ,以下是頁面執行時,ASP.NET 如何處理這些路徑:

  • myImagesFolder: http://myserver/myapp/images
  • myStyleSheet : http://myserver/myapp/styles/Stylesheet.css

(您實際上不會將這些路徑視為變數的值,但 ASP.NET 會將路徑視為這些路徑。)

您可以在 ~ 伺服器程式碼 (中使用 運算子,如上述) 和標記,如下所示:

<!-- Examples of using the ~ operator in markup in ASP.NET Web Pages -->

<a href="~/Default">Home</a>
<img src="~/images/MyImages.png" />

在標記中 ~ ,您可以使用 運算子來建立資源的路徑,例如影像檔、其他網頁和 CSS 檔案。 當頁面執行時,ASP.NET 查看頁面 (程式碼和標記) ,並解析適當路徑的所有 ~ 參考。

條件式邏輯和迴圈

ASP.NET 伺服器程式碼可讓您根據條件執行工作,並撰寫會重複語句的特定次數的程式碼,也就是執行迴圈的程式碼) 。

測試條件

若要測試簡單條件,請使用 If...Then 語句,它會根據您指定的測試傳回 TrueFalse

@Code
    Dim showToday = True
    If showToday Then
        DateTime.Today
    End If
End Code

關鍵字會 If 啟動區塊。 實際的測試 (條件) 遵循 If 關鍵字並傳回 true 或 false。 語句結尾 IfThen 。 如果測試為 true,將會執行的語句會由 IfEnd If 括住。 If語句可以包含區塊 Else ,指定條件為 false 時要執行的語句:

@Code
    Dim showToday = False
    If showToday Then
        DateTime.Today
    Else
        @<text>Sorry!</text>
    End If
End Code

If如果語句啟動程式碼區塊,則不需要使用一般 Code...End Code 語句來包含區塊。 您可以直接將 新增 @ 至 區塊,它將會運作。 此方法可搭配 If 其他 Visual Basic 程式設計關鍵字使用,後面接著程式碼區塊,包括 ForFor EachDo While 等。

@If showToday Then
    DateTime.Today
Else
    @<text>Sorry!</text>
End If

您可以使用一或多個區塊來新增多個 ElseIf 條件:

@Code
    Dim theBalance = 4.99
    If theBalance = 0 Then
        @<p>You have a zero balance.</p>
    ElseIf theBalance > 0 AndAlso theBalance <= 5 Then
        ' If the balance is above 0 but less than
        ' or equal to $5, display this message.
        @<p>Your balance of $@theBalance is very low.</p>
    Else
        ' For balances greater than $5, display balance.
        @<p>Your balance is: $@theBalance</p>
    End If    
End Code

在此範例中,如果區塊中的 If 第一個條件不是 true,則會 ElseIf 檢查條件。 如果符合該條件,則會執行 區塊中的 ElseIf 語句。 如果不符合任何條件,則會執行 區塊中的 Else 語句。 您可以新增任意數目的 ElseIf 區塊,然後使用 Else 區塊關閉為「其他所有專案」條件。

若要測試大量條件,請使用 Select Case 區塊:

@Code
    Dim weekday = "Wednesday"
    Dim greeting = ""
    
    Select Case weekday
        Case "Monday"
            greeting = "Ok, it's a marvelous Monday."
        Case "Tuesday"
            greeting = "It's a tremendous Tuesday."
        Case "Wednesday"
            greeting = "Wild Wednesday is here!"
        Case Else
            greeting = "It's some other day, oh well."
    End Select
End Code
<p>Since it is @weekday, the message for today is: @greeting</p>

要測試的值在範例中 (括弧中,工作日變數) 。 每個個別測試都會使用列出 Case 值的 語句。 如果語句的值 Case 符合測試值,則會執行該 Case 區塊中的程式碼。

最後兩個條件式區塊的結果會顯示在瀏覽器中:

Razor-Img10

迴圈程式碼

您通常需要重複執行相同的語句。 您可以迴圈執行此動作。 例如,您通常會針對資料集合中的每個專案執行相同的語句。 如果您確切知道想要迴圈的次數,可以使用 For 迴圈。 這種迴圈特別適合用於計算或倒數:

@For i = 10 To 20
    @<p>Item #: @i</p>
Next i

迴圈的開頭為 For 關鍵字,後面接著三個元素:

  • 緊接在 For 語句之後,您會宣告計數器變數, (您不需要使用 Dim) ,然後指示範圍,如 中所示 i = 10 to 20 。 這表示變數 i 會開始計算為 10,並繼續計算,直到達到 20 (內含) 為止。
  • ForNext 語句之間是 區塊的內容。 這可以包含一或多個以每個迴圈執行的程式碼語句。
  • 語句結束 Next i 迴圈。 它會遞增計數器,並啟動迴圈的下一個反復專案。

Next 行之間的 For 程式程式碼包含針對迴圈的每個反復專案執行的程式碼。 標記會在每次) 建立新的段落 (<p> 專案,並在輸出中新增一行,以顯示計數器) (i 的值。 當您執行此頁面時,此範例會建立 11 行來顯示輸出,並在每一行中顯示專案編號的文字。

Razor-Img11

如果您正在使用集合或陣列,您通常會使用 For Each 迴圈。 集合是一組類似的物件,迴圈 For Each 可讓您在集合中的每個專案上執行工作。 這種類型的迴圈對於集合而言很方便,因為不同于 For 迴圈,您不需要遞增計數器或設定限制。 相反地,迴圈程式 For Each 代碼只會繼續進行集合,直到完成為止。

本範例會傳回集合 (中的 Request.ServerVariables 專案,其中包含網頁伺服器) 的相關資訊。 它會使用 For Each 迴圈來顯示每個專案的名稱,方法是在 HTML 項目符號清單中建立新 <li> 元素。

<ul>
@For Each myItem In Request.ServerVariables
    @<li>@myItem</li>
Next myItem
</ul>

關鍵字 For Each 後面接著一個變數,代表範例中集合 (的單一專案, myItem) ,後面接著 關鍵字,後面接著 In 您想要迴圈的集合。 在迴圈主體中 For Each ,您可以使用您稍早宣告的變數來存取目前的專案。

Razor-Img12

若要建立更一般用途的迴圈,請使用 Do While 語句:

@Code
    Dim countNum = 0
    Do While countNum < 50
        countNum += 1
        @<p>Line #@countNum: </p>
    Loop
End Code

此迴圈的開頭為 Do While 關鍵字,後面接著條件,後面接著 要重複的 區塊。 迴圈通常會遞增 (加入至) 或遞減, (減去用於計算的變數或物件) 。 在此範例中 += ,運算子會在每次執行迴圈時,將 1 新增至變數的值。 (若要在倒數倒數的迴圈中遞減變數,您可以使用遞減運算子 -= .)

物件和集合

ASP.NET 網站中幾乎所有專案都是物件,包括網頁本身。 本節將討論一些您將在程式碼中經常使用的重要物件。

Page 物件

ASP.NET 中最基本的物件是頁面。 您可以直接存取頁面物件的屬性,而不需要任何限定的物件。 下列程式碼會使用 Request 頁面的 物件,取得頁面的檔案路徑:

@Code
    Dim path = Request.FilePath
End Code

您可以使用 物件的屬性 Page 來取得許多資訊,例如:

  • Request. 如您所見,這是目前要求的相關資訊集合,包括瀏覽器提出要求的類型、頁面的 URL、使用者身分識別等。

  • Response. 這是回應 (頁面) 的相關資訊集合,會在伺服器程式碼完成執行時傳送至瀏覽器。 例如,您可以使用這個屬性將資訊寫入回應中。

    @Code
        ' Access the page's Request object to retrieve the URL.
        Dim pageUrl = Request.Url
    End Code
        <a href="@pageUrl">My page</a>
    

集合物件 (陣列和字典)

集合是相同類型的物件群組,例如資料庫的 物件集合 Customer 。 ASP.NET 包含許多內建集合,例如 Request.Files 集合。

您通常會在集合中使用資料。 兩個常見的集合類型是 陣列字典。 當您想要儲存類似專案的集合,但不想建立個別的變數來保存每個專案時,陣列會很有用:

<h3>Team Members</h3>
@Code
    Dim teamMembers() As String = {"Matt", "Joanne", "Robert", "Nancy"}
    For Each name In teamMembers
        @<p>@name</p>
    Next name
End Code

使用陣列時,您會宣告特定的資料類型,例如 StringIntegerDateTime 。 若要指出變數可以包含陣列,請將括弧新增至宣告中的變數名稱 (,例如 Dim myVar() As String) 。 您可以使用陣列中專案的位置 (索引) 或使用 語句來 For Each 存取。 陣列索引是以零起始,也就是第一個專案位於位置 0、第二個專案位於位置 1 等等。

@Code
    Dim teamMembers() As String = {"Matt", "Joanne", "Robert", "Nancy"}
    @<p>The number of names in the teamMembers array: @teamMembers.Length </p>
    @<p>Robert is now in position: @Array.IndexOf(teamMembers, "Robert")</p>
    @<p>The array item at position 2 (zero-based) is @teamMembers(2)</p>
    @<h3>Current order of team members in the list</h3>
    For Each name In teamMembers
        @<p>@name</p>
    Next name
    @<h3>Reversed order of team members in the list</h3>
    Array.Reverse(teamMembers)
    For Each reversedItem In teamMembers
        @<p>@reversedItem</p>
    Next reversedItem
End Code

您可以藉由取得陣列的 屬性來判斷陣列 Length 中的專案數目。 若要取得陣列中特定專案的位置, (也就是說,若要搜尋陣列) ,請使用 Array.IndexOf 方法。 您也可以) 方法) 或 (方法) 排序內容等動作,例如反轉 (Array.Reverse 陣列的內容 Array.Sort

在瀏覽器中顯示的字串陣列程式碼輸出:

Razor-Img13

字典是索引鍵/值組的集合,您可以在其中提供索引鍵 (或名稱) 來設定或擷取對應的值:

@Code
    Dim myScores = New Dictionary(Of String, Integer)()
    myScores.Add("test1", 71)
    myScores.Add("test2", 82)
    myScores.Add("test3", 100)
    myScores.Add("test4", 59)
End Code
<p>My score on test 3 is: @myScores("test3")%</p>
@Code 
    myScores("test4") = 79
End Code
<p>My corrected score on test 4 is: @myScores("test4")%</p>

若要建立字典,您可以使用 New 關鍵字來指出您要建立新的 Dictionary 物件。 您可以使用 關鍵字,將字典指派給變數 Dim 。 您可以使用括弧 () ( ) 來指出字典中專案的資料類型。 在宣告結束時,您必須新增另一組括弧,因為這是建立新字典的方法。

若要將專案新增至字典,您可以在此案例中呼叫 Add 字典變數的 方法 () myScores ,然後指定索引鍵和值。 或者,您可以使用括弧來指出索引鍵並執行簡單的指派,如下列範例所示:

@Code
    myScores("test4") = 79
End Code

若要從字典取得值,請在括弧中指定索引鍵:

@myScores("test4")

使用參數呼叫方法

如本文稍早所見,您使用 的程式物件具有 方法。 例如, Database 物件可能有 Database.Connect 方法。 許多方法也有一或多個參數。 參數是您傳遞至 方法的值,可讓 方法完成其工作。 例如,查看 方法的 Request.MapPath 宣告,其採用三個參數:

Public Overridable Function MapPath (virtualPath As String, _
    baseVirtualDir As String, _
    allowCrossAppMapping As Boolean)

這個方法會傳回對應至指定虛擬路徑之伺服器上的實體路徑。 方法的三個參數為 virtualPathbaseVirtualDirallowCrossAppMapping 。 (請注意,在宣告中,參數會以將接受的資料資料類型列出。) 當您呼叫此方法時,您必須提供這三個參數的值。

當您使用 Visual Basic 搭配 Razor 語法時,有兩個選項可將參數傳遞至方法: 位置參數具名參數。 若要使用位置參數呼叫方法,請使用方法宣告中指定的嚴格順序傳遞參數。 (您通常會透過閱讀 method.) 的檔來瞭解此順序。您必須遵循順序,而且您無法略過任何參數—如有必要,您可以針對沒有值的位置參數傳遞空字串 ("") (或 null。

下列範例假設您網站上有一個名為 腳本 的資料夾。 程式碼會呼叫 方法, Request.MapPath 並以正確的順序傳遞三個參數的值。 然後會顯示產生的對應路徑。

@Code
    ' Pass parameters to a method using positional parameters.
    Dim myPathPositional = Request.MapPath("/scripts", "/", true)
End Code
<p>@myPathPositional</p>

當方法有許多參數時,您可以使用具名參數,讓您的程式碼更簡潔且更容易閱讀。 若要使用具名參數呼叫方法,請指定後面接著 := 的參數名稱,然後提供值。 具名參數的優點是您可以依您想要的任何順序加以新增。 (缺點是方法呼叫不是 compact.)

下列範例會呼叫與上述相同的方法,但使用具名參數來提供值:

@Code
    ' Pass parameters to a method using named parameters.
    Dim myPathNamed = Request.MapPath(baseVirtualDir:= "/", allowCrossAppMapping:= true, virtualPath:= "/scripts")
End Code
<p>@myPathNamed</p>

如您所見,參數會以不同的順序傳遞。 不過,如果您執行上一個範例和這個範例,它們會傳回相同的值。

處理錯誤

Try-Catch 語句

您通常會在程式碼中有語句,可能會因為控制項外部的原因而失敗。 例如:

  • 如果您的程式碼嘗試開啟、建立、讀取或寫入檔案,可能會發生各種錯誤。 您想要的檔案可能不存在、可能已鎖定、程式碼可能沒有許可權等等。
  • 同樣地,如果您的程式碼嘗試更新資料庫中的記錄,可能會發生許可權問題、卸載資料庫的連線、要儲存的資料可能無效等等。

在程式設計詞彙中,這些情況稱為 例外狀況。 如果您的程式碼遇到例外狀況,它會產生 (擲回) 一則錯誤訊息,也就是最好對使用者很不想要。

Razor-Img14

如果您的程式碼可能會遇到例外狀況,而且為了避免此類型的錯誤訊息,您可以使用 Try/Catch 語句。 在 語句中 Try ,您會執行正在檢查的程式碼。 在一或多個 Catch 語句中,您可以尋找特定錯誤 (可能發生的特定例外狀況類型) 。 您可以視需要包含許多 Catch 語句來尋找您預期的錯誤。

注意

建議您避免在 語句中使用 Response.RedirectTry/Catch 方法,因為它可能會導致頁面發生例外狀況。

下列範例顯示第一個要求上建立文字檔的頁面,然後顯示可讓使用者開啟檔案的按鈕。 此範例會刻意使用不正確的檔案名,以便造成例外狀況。 此程式碼包含 Catch 兩個可能例外狀況的語句: FileNotFoundException ,如果檔案名不正確,就會發生,如果 DirectoryNotFoundException ASP.NET 甚至找不到資料夾,就會發生這種情況。 (您可以取消批註範例中的 語句,以查看當一切正常運作時如何執行。)

如果您的程式碼未處理例外狀況,您會看到類似上一個螢幕擷取畫面的錯誤頁面。 不過,本節 Try/Catch 有助於防止使用者看到這些類型的錯誤。

@Code
    Dim dataFilePath = "~/dataFile.txt"
    Dim fileContents = ""
    Dim physicalPath = Server.MapPath(dataFilePath)
    Dim userMessage = "Hello world, the time is " + DateTime.Now
    Dim userErrMsg = ""
    Dim errMsg = ""
    
    If IsPost Then
        ' When the user clicks the "Open File" button and posts
        ' the page, try to open the file.
        Try
            ' This code fails because of faulty path to the file.
            fileContents = File.ReadAllText("c:\batafile.txt")
            
            ' This code works. To eliminate error on page, 
            ' comment the above line of code and uncomment this one.
            ' fileContents = File.ReadAllText(physicalPath)
            
        Catch ex As FileNotFoundException
            ' You can use the exception object for debugging, logging, etc.
            errMsg = ex.Message
            ' Create a friendly error message for users.
            userErrMsg = "The file could not be opened, please contact " _
                & "your system administrator."
                
        Catch ex As DirectoryNotFoundException
            ' Similar to previous exception.
            errMsg = ex.Message
            userErrMsg = "The file could not be opened, please contact " _
                & "your system administrator."
        End Try
    Else
        ' The first time the page is requested, create the text file.
        File.WriteAllText(physicalPath, userMessage)
    End If
End Code
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Try-Catch Statements</title>
    </head>
    <body>  
    <form method="POST" action="" >
      <input type="Submit" name="Submit" value="Open File"/>
    </form>
    
    <p>@fileContents</p>
    <p>@userErrMsg</p>
    
    </body>
</html>

其他資源

參考文件