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

作者:Tom FitzMacken

本文提供使用 Razor 語法 ASP.NET Web Pages程式設計的概觀。 ASP.NET 是 Microsoft 在網頁伺服器上執行動態網頁的技術。 本文著重于使用 C# 程式設計語言。

您將瞭解的內容

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

軟體版本

  • ASP.NET Web Pages (Razor) 3

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

前 8 大程式設計秘訣

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

注意

Razor 語法是以 C# 程式設計語言為基礎,而這是最常搭配 ASP.NET Web Pages使用的語言。 不過,Razor 語法也支援 Visual Basic 語言,而您看到的所有專案也可以在 Visual Basic 中執行。 如需詳細資訊,請參閱 附錄 Visual Basic 語言和語法

您可以在本文稍後找到大部分這些程式設計技術的詳細資料。

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

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

<!-- Single statement blocks  -->
@{ var total = 7; }
@{ var myMessage = "Hello World"; }

<!-- Inline expressions -->
<p>The value of your account is: @total </p>
<p>The value of myMessage is: @myMessage</p>

<!-- Multi-statement block -->
@{
    var greeting = "Welcome to our site!";
    var weekDay = DateTime.Now.DayOfWeek;
    var greetingMessage = greeting + " Today is: " + weekDay;
}
<p>The greeting is: @greetingMessage</p>

當頁面在瀏覽器中執行時,這就是這些語句的外觀:

Razor-Img1

提示

HTML 編碼

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

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

您可以在 使用表單中深入瞭解 HTML 編碼。

2.您會以大括弧括住程式碼區塊

程式 代碼區塊 包含一或多個程式碼語句,並以大括弧括住。

<!-- Single statement block.  -->
@{ var theMonth = DateTime.Now.Month; }
<p>The numeric value of the current month: @theMonth</p>

<!-- Multi-statement block. -->
@{
    var outsideTemp = 79;
    var weatherMessage = "Hello, it is " + outsideTemp + " degrees.";
}
<p>Today's weather: @weatherMessage</p>

在瀏覽器中顯示的結果:

Razor-Img2

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

在程式碼區塊內,每個完整的程式碼語句都必須以分號結尾。 內嵌運算式不會以分號結尾。

<!-- Single-statement block -->
@{ var theMonth = DateTime.Now.Month; }

<!-- Multi-statement block -->
@{
    var outsideTemp = 79;
    var weatherMessage = "Hello, it is " + outsideTemp + " degrees.";
}

<!-- Inline expression, so no semicolon -->
<p>Today's weather: @weatherMessage</p>

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

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

<!-- Storing a string -->
@{ var welcomeMessage = "Welcome, new members!"; }
<p>@welcomeMessage</p>

<!-- Storing a date -->
@{ var year = DateTime.Now.Year; }

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

在瀏覽器中顯示的結果:

Razor-Img3

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

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

@{ var myString = "This is a string literal"; }

如果您想要顯示的字串包含反斜線字元 () \ 或雙引號 " () ,請使用前面加上運算子的 逐字字串常值@ 。 (在 C# 中,除非您使用逐字字串常值.) ,否則 \ 字元具有特殊意義

<!-- Embedding a backslash in a string -->
@{ var myFilePath = @"C:\MyFolder\"; }
<p>The path is: @myFilePath</p>

若要內嵌雙引號,請使用逐字字串常值並重複引號:

<!-- Embedding double quotation marks in a string -->
@{ var myQuote = @"The person said: ""Hello, today is Monday."""; }
<p>@myQuote</p>

以下是在頁面中使用這兩個範例的結果:

Razor-Img4

注意

請注意, @ 字元同時用來標記 C# 中的逐字字串常值,以及標記 ASP.NET 網頁中的程式碼。

6.程式碼區分大小寫

在 C# 中,關鍵字 (,例如 vartrueif) 和 變數名稱會區分大小寫。 下列幾行程式碼會建立兩個不同的變數, lastName 以及 LastName.

@{
    var lastName = "Smith";
    var LastName = "Jones";
}

如果您將變數宣告為 var lastName = "Smith"; ,並嘗試將頁面中的該變數參考為 @LastName ,您會取得值 "Jones" ,而不是 "Smith"

注意

在 Visual Basic 中,關鍵字和變數 區分大小寫。

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 語句) 。

@{
   var result = "";
   if(IsPost)
   {
      result = "This page was posted using the Submit button.";
   }
   else
   {
      result = "This was the first request for this page.";
   }
}

<!DOCTYPE html>
<html>
    <head>
        <title></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.cshtml

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

    @{
        var total = 0;
        var totalMessage = "";
        if(IsPost) {
    
            // Retrieve the numbers that the user entered.
            var num1 = Request["text1"];
            var num2 = Request["text2"];
    
            // Convert the entered strings into integers numbers and add.
            total = num1.AsInt() + num2.AsInt();
            totalMessage = "Total = " + total;
        }
    }
    
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <title>Add Numbers</title>
        <meta charset="utf-8" />
        <style type="text/css">
          body {background-color: beige; font-family: Verdana, Arial;
                margin: 50px; }
          form {padding: 10px; border-style: solid; width: 250px;}
        </style>
      </head>
    <body>
      <p>Enter two whole numbers and then click <strong>Add</strong>.</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
    • 頁面頂端的區塊會以大括弧括住。
    • 在頂端的 區塊中,所有行都會以分號結尾。
    • 變數 totalnum1num2 和 會 totalMessage 儲存數個數字和字串。
    • 指派給變數的 totalMessage 常值字串值是以雙引號括住。
    • 因為程式碼區分大小寫,所以當變數在頁面底部附近使用時 totalMessage ,其名稱必須完全符合頂端的變數。
    • 運算式 num1.AsInt() + num2.AsInt() 示範如何使用物件和方法。 每個 AsInt 變數上的 方法會將使用者輸入的字串轉換成數位 (整數) ,讓您可以對它執行算術。
    • <form> 標包含 method="post" 屬性。 這會指定當使用者按一下 [ 新增] 時,頁面將會使用 HTTP POST 方法傳送至伺服器。 提交頁面時, if(IsPost) 測試會評估為 true,並執行條件式程式碼,以顯示新增數位的結果。
  3. 儲存頁面並在瀏覽器中執行。 (在 [ 檔案 ] 工作區中選取頁面,再執行它。) 輸入兩個整數,然後按一下 [ 新增 ] 按鈕。

    Razor-Img7

基本程式設計概念

本文提供 web 程式設計 ASP.NET 概觀。 這不是詳盡的檢查,只是快速流覽您最常使用的程式設計概念。 即使如此,它幾乎涵蓋開始使用 ASP.NET Web Pages所需的所有專案。

但首先,一些技術背景。

Razor 語法、伺服器程式碼和 ASP.NET

Razor 語法是簡單的程式設計語法,可將以伺服器為基礎的程式碼內嵌在網頁中。 在使用 Razor 語法的網頁中,有兩種內容:用戶端內容和伺服器程式碼。 用戶端內容是您用於網頁的內容:HTML 標籤 (元素) 、樣式資訊,例如 CSS、可能是某些用戶端腳本,例如 JavaScript 和純文字。

Razor 語法可讓您將伺服器程式碼新增至此用戶端內容。 如果網頁中有伺服器程式碼,則伺服器會先執行該程式碼,然後再將該網頁傳送至瀏覽器。 藉由在伺服器上執行,程式碼可以執行更複雜的工作,以單獨使用用戶端內容來執行,例如存取伺服器型資料庫。 最重要的是,伺服器程式碼可以動態建立用戶端內容—它可以即時產生 HTML 標籤或其他內容,然後將它傳送至瀏覽器,以及頁面可能包含的任何靜態 HTML。 從瀏覽器的觀點來看,伺服器程式碼所產生的用戶端內容,與其他用戶端內容並無不同。 如您所見,所需的伺服器程式碼相當簡單。

ASP.NET 包含 Razor 語法的網頁具有特殊副檔名 (.cshtml.vbhtml) 。 伺服器會辨識這些延伸模組、執行以 Razor 語法標示的程式碼,然後將頁面傳送至瀏覽器。

ASP.NET 放入何處?

Razor 語法是以 Microsoft 稱為 ASP.NET 的技術為基礎,而這項技術則是以 Microsoft .NET Framework為基礎。 The.NET Framework 是 Microsoft 針對幾乎任何類型的電腦應用程式進行開發的大型完整程式設計架構。 ASP.NET 是專為建立 Web 應用程式所設計之.NET Framework的一部分。 開發人員已使用 ASP.NET 來建立全球許多最大的最高流量網站。 (每當您在網站中看到副檔名 .aspx 做為 URL 的一部分時,您就會知道網站是使用 ASP.NET.)

Razor 語法提供您 ASP.NET 的所有功能,但使用簡化的語法可讓您更輕鬆地瞭解您是否是初學者,而且如果您是專家,可讓您更具生產力。 雖然這個語法很容易使用,但其與 ASP.NET 和.NET Framework的系列關聯性,這表示隨著您的網站變得更複雜,您擁有較大型架構的功能可供您使用。

Razor-Img8

提示

類別和實例

ASP.NET 伺服器程式碼會使用 物件,而物件會接著建置在類別的概念上。 類別是 物件的定義或範本。 例如,應用程式可能包含類別 Customer ,定義任何客戶物件所需的屬性和方法。

當應用程式需要使用實際的客戶資訊時,它會建立 (實例,或) 客戶物件具 現化 實例。 每個個別客戶都是 類別的 Customer 個別實例。 每個實例都支援相同的屬性和方法,但每個實例的屬性值通常不同,因為每個客戶物件都是唯一的。 在一個客戶物件中 LastName ,屬性可能是 「Smith」;在另一個客戶物件中, LastName 該屬性可能是 「Jones」。

同樣地,網站中的任何個別網頁都是 Page 類別實例的物件 Page 。 頁面上的按鈕是 類別 Button 實例的物件 Button ,依此類故。 每個實例都有自己的特性,但全都是以物件類別定義中指定的專案為基礎。

基本語法

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

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

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

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

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

    @if(IsPost) {
        // 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: <br /> </p>  @DateTime.Now
    }
    

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

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

    @if(IsPost) {
        // Plain text followed by an unmatched HTML tag and server code.
        @: The time is: <br /> @DateTime.Now
        <br/>
        // Server code and then plain text, matched tags, and more text.
        @DateTime.Now @:is the <em>current</em> time.
    }
    

    如果您想要輸出多行文字或不相符的 HTML 標籤,可以在每一行前面加上 @: ,或者您可以將行括在元素中 <text>@:如同運算子, <text> 標籤是由 ASP.NET 用來識別文字內容,而且永遠不會在頁面輸出中轉譯。

    @if(IsPost) {
        // Repeat the previous example, but use <text> tags.
        <text>
        The time is: <br /> @DateTime.Now
        <br/>
        @DateTime.Now is the <em>current</em> time.
        </text>
    }
    
    @{
        var minTemp = 75;
        <text>It is the month of @DateTime.Now.ToString("MMMM"), and
        it's a <em>great</em> day! <br /><p>You can go swimming if it's at
        least @minTemp degrees. </p></text>
    }
    

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

    注意

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

空白

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

@{ var lastName =    "Smith"; }

語句中的分行符號對 語句沒有任何作用,而且您可以包裝語句以取得可讀性。 下列陳述式是相同的:

@{ var theName =
"Smith"; }

@{
    var
    personName
    =
    "Smith"
    ;
}

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

@{ var test = "This is a long
    string"; }  // Does not work!

若要結合包裝成多個行的長字串,如上述程式碼,有兩個選項。 您可以使用串連運算子 (+) ,本文稍後將會看到此運算子。 您也可以使用 @ 字元來建立逐字字串常值,如本文稍早所見。 您可以跨行中斷逐字字串常值:

@{ var longString = @"This is a
    long
    string";
}

程式碼 (和標記) 批註

批註可讓您自行或其他人留下筆記。 它們也可讓您停用 (批 注化) 您不想執行的程式碼或標記區段,但想要暫時保留在頁面中。

Razor 程式碼和 HTML 標籤有不同的批註語法。 如同所有 Razor 程式碼,Razor 批註會處理 (,然後在將頁面傳送至瀏覽器之前,在伺服器上移除) 。 因此,Razor 批註語法可讓您將批註放入程式碼 (,甚至是在編輯檔案時可以看到的標記) ,但使用者甚至看不到頁面來源。

針對 ASP.NET Razor 批註,您可以使用 來啟動批註,並以 結束批 *@@* 。 批註可以位於一行或多行:

@*  A one-line code comment. *@

@*
    This is a multiline code comment.
    It can continue for any number of lines.
*@

以下是程式碼區塊內的批註:

@{
    @* This is a comment. *@
    var theVar = 17;
}

以下是相同的程式碼區塊,其中已批註程式程式碼,使其不會執行:

@{
    @* This is a comment. *@
    @* var theVar = 17;  *@
}

在程式碼區塊中,除了使用 Razor 批註語法外,您也可以使用所使用程式設計語言的批註語法,例如 C#:

@{
    // This is a comment.
    var myVar = 17;
    /* This is a multi-line comment
    that uses C# commenting syntax. */
}

在 C# 中,單行批註前面會加上 // 字元,而多行批註的開頭 /* 為 ,並以 結尾 */ 。 (與 Razor 批註相同,C# 批註不會轉譯為 browser.)

針對標記,您可能會知道,您可以建立 HTML 批註:

<!-- This is a comment.  -->

HTML 批註開頭為 <!-- 字元,結尾為 --> 。 您可以使用 HTML 批註來括住文字,也可以括住您想要保留在頁面中但不想轉譯的任何 HTML 標籤。 此 HTML 批註會隱藏標籤的整個內容及其包含的文字:

<!-- <p>This is my paragraph.</p>  -->

不同于 Razor 批註,HTML 批註 轉譯至頁面,而且使用者可以藉由檢視頁面來源來查看它們。

Razor 對 C# 的巢狀區塊有限制。 如需詳細資訊,請參閱 具名 C# 變數和巢狀區塊產生中斷的程式碼

變數

變數是用來儲存資料的具名物件。 您可以將變數命名為任何專案,但名稱開頭必須是字母字元,而且不能包含空白字元或保留字元。

變數和資料類型

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

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

如果您不想指定 var 類型) 或使用類型名稱,請使用 關鍵字 (宣告變數:

@{
    // Assigning a string to a variable.
    var greeting = "Welcome!";

    // Assigning a number to a variable.
    var theCount = 3;

    // Assigning an expression to a variable.
    var monthlyTotal = theCount + 5;

    // Assigning a date value to a variable.
    var today = DateTime.Today;

    // Assigning the current page's URL to a variable.
    var myPath = this.Request.Url;

    // Declaring variables using explicit data types.
    string name = "Joe";
    int count = 5;
    DateTime tomorrow = DateTime.Now.AddDays(1);
}

下列範例顯示網頁中變數的一些一般用法:

@{
    // Embedding the value of a variable into HTML markup.
    <p>@greeting, friends!</p>

    // Using variables as part of an inline expression.
    <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。 即使您不需要轉換類型,有時測試還是會協助您查看您可能正在使用的資料類型。

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

@{
    var total = 0;

    if(IsPost) {
        // Retrieve the numbers that the user entered.
        var num1 = Request["text1"];
        var num2 = Request["text2"];
        // Convert the entered strings into integers numbers and add.
        total = num1.AsInt() + num2.AsInt();
    }
}

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

無法隱含地將類型 'string' 轉換為 'int'。

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

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

方法

描述

範例


AsInt(), IsInt()

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

var myIntNumber = 0;
var myStringNum = "539";
if(myStringNum.IsInt()==true){
    myIntNumber = myStringNum.AsInt();
}

AsBool(), IsBool()

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

var myStringBool = "True";
var myVar = myStringBool.AsBool();

AsFloat(), IsFloat()

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

var myStringFloat = "41.432895";
var myFloatNum = myStringFloat.AsFloat();

AsDecimal(), IsDecimal()

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

var myStringDec = "10317.425";
var myDecNum = myStringDec.AsDecimal();

AsDateTime(), IsDateTime()

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

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

ToString()

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

int num1 = 17;
int num2 = 76;
// myString is set to 1776
string myString = num1.ToString() +
  num2.ToString();

運算子

運算子是一個關鍵字或字元,可告訴 ASP.NET 在運算式中執行的命令類型。 C# 語言 (和以它為基礎的 Razor 語法) 支援許多運算子,但您只需要辨識幾個才能開始使用。 下表摘要說明最常見的運算子。

運算子

描述

範例


+ - * /

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

@(5 + 13)
@{ var netWorth = 150000; }
@{ var newTotal = netWorth * 2; }
@(newTotal / 2)

=

指派。 將語句右側的值指派給左側的物件。

var age = 17;

==

相等。 true如果值相等,則傳回 。 (請注意運算子與 == operator.) 之間的差異 =

var myNum = 15;
if (myNum == 15) {
    // Do something.
}

!=

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

var theNum = 13;
if (theNum != 15) {
    // Do something.
}

< > <= >=

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

if (2 < 3) {
    // Do something.
}
var currentCount = 12;
if(currentCount >= 12) {
    // Do something.
}

+

串連,用來聯結字串。 ASP.NET 根據運算式的資料類型,知道這個運算子與加法運算子之間的差異。

// The displayed result is "abcdef".
@("abc" + "def")

+= -=

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

int theCount = 0;
theCount += 1; // Adds 1 to count

.

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

var myUrl = Request.Url;
var count = Request["Count"].AsInt();

()

括弧。 用來將運算式分組,並將參數傳遞至方法。

@(3 + 7)
@Request.MapPath(Request.FilePath);

[]

括弧。 用於存取陣列或集合中的值。

var income = Request["AnnualIncome"];

!

不是。 將 true 值反轉為 false ,反之亦然。 通常用來做為測試 (的簡短方式 false ,也就是不 true) 。

bool taskCompleted = false;
// Processing.
if(!taskCompleted) {
    // Continue processing
}

&& ||

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

bool myTaskCompleted = false;
int totalCount = 0;
// Processing.
if(!myTaskCompleted && totalCount < 12) {
    // Continue processing.
}

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

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

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 會遵循網域或伺服器名稱。 當您使用虛擬路徑時,您可以將程式碼移至不同的網域或伺服器,而不需要更新路徑。

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

完整 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) 。 每當您需要完整的實體路徑時,就會使用此方法。 典型的範例是當您在網頁伺服器上讀取或寫入文字檔或影像檔時。

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

@{
    var dataFilePath = "~/dataFile.txt";
}
<!-- Displays a physical path C:\Websites\MyWebSite\datafile.txt  -->
<p>@Server.MapPath(dataFilePath)</p>

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

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

@{
    var myImagesFolder = "~/images";
    var myStyleSheet = "~/styles/StyleSheet.css";
}

如果網站是 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 簡單條件,它會根據您指定的測試傳回 true 或 false:

@{
  var showToday = true;
  if(showToday)
  {
    @DateTime.Today;
  }
}

關鍵字會 if 啟動區塊。 實際測試 (條件) 在括弧中,並傳回 true 或 false。 如果測試為 true,則執行的語句會以大括弧括住。 if語句可以包含 else 區塊,指定條件為 false 時要執行的語句:

@{
  var showToday = false;
  if(showToday)
  {
    @DateTime.Today;
  }
  else
  {
    <text>Sorry!</text>
  }
}

您可以使用 區塊新增多個條件 else if

@{
    var theBalance = 4.99;
    if(theBalance == 0)
    {
        <p>You have a zero balance.</p>
    }
    else if (theBalance  > 0 && theBalance <= 5)
    {
        <p>Your balance of $@theBalance is very low.</p>
    }
    else
    {
        <p>Your balance is: $@theBalance</p>
    }
}

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

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

@{
    var weekday = "Wednesday";
    var greeting = "";

    switch(weekday)
    {
        case "Monday":
            greeting = "Ok, it's a marvelous Monday";
            break;
        case "Tuesday":
            greeting = "It's a tremendous Tuesday";
            break;
        case "Wednesday":
            greeting = "Wild Wednesday is here!";
            break;
        default:
            greeting = "It's some other day, oh well.";
            break;
    }

    <p>Since it is @weekday, the message for today is: @greeting</p>
}

要測試的值位於範例中的括弧 (,變數 weekday) 。 每個個別測試都會使用 case 以冒號結尾的語句, (:) 。 如果語句的值 case 符合測試值,則會執行該案例區塊中的程式碼。 您可以使用 語句關閉每個 case 語句 break 。 (如果您忘記在每個區塊中包含 case 中斷,則下 case 一個語句中的程式碼也會執行。) 區塊 switch 通常會有語句做為其他任何情況的最後一個 default 案例,如果其他案例都不存在,則會執行。

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

Razor-Img10

迴圈程式碼

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

@for(var i = 10; i < 21; i++)
{
    <p>Line #: @i</p>
}

迴圈以 for 關鍵字開頭,後面接著括弧中的三個語句,每個語句以分號終止。

  • 在括弧內,第一個語句 (var i=10;) 建立計數器,並將其初始化為 10。 您不需要為計數器 i 命名 , 您可以使用任何變數。 for當迴圈執行時,計數器會自動遞增。
  • 第二個語句 (i < 21;) 設定您要計算多少距離的條件。 在此情況下,您希望它最多移至 20 個 (,也就是在計數器小於 21) 時繼續運作。
  • 第三個 i++ 語句 () 會使用遞增運算子,其只會指定每次迴圈執行時,計數器應該新增 1 個。

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

Razor-Img11

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

例如,下列程式碼會傳回集合中的 Request.ServerVariables 專案,此物件包含網頁伺服器的相關資訊。 它會使用 foreac h 迴圈來顯示每個專案的名稱,方法是在 HTML 項目符號清單中建立新 <li> 元素。

<ul>
@foreach (var myItem in Request.ServerVariables)
{
    <li>@myItem</li>
}
</ul>

關鍵字 foreach 後面接著括弧,您可以在其中宣告代表 (範例中集合中單一專案的變數, var item) ,後面 in 接著 關鍵字,後面接著您要迴圈的集合。 在迴圈本文中 foreach ,您可以使用您稍早宣告的變數來存取目前的專案。

Razor-Img12

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

@{
    var countNum = 0;
    while (countNum < 50)
    {
        countNum += 1;
        <p>Line #@countNum: </p>
    }
}

while迴圈會以 while 關鍵字開頭,後面接著括弧,您可以在其中指定迴圈繼續 (多久,只要 countNum 小於 50) ,則要重複的區塊。 迴圈通常會遞增 (新增至) 或遞減 (減去用於計算的變數或物件) 。 在此範例中 += ,運算子會在每次執行迴圈時,將 1 新增至 countNum 。 (若要遞減迴圈中倒數的變數,您會使用遞減運算子 -=) 。

物件和集合

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

Page 物件

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

@{
    var path = Request.FilePath;
}

若要清楚指出您參考目前頁面物件上的屬性和方法,您可以選擇性地使用 關鍵字 this 來代表程式碼中的頁面物件。 以下是先前的程式碼範例,已 this 新增 來代表頁面:

@{
    var path = this.Request.FilePath;
}

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

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

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

    @{
        // Access the page's Request object to retrieve the Url.
        var pageUrl = this.Request.Url;
    }
    <a href="@pageUrl">My page</a>
    

集合物件 (陣列和字典)

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

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

@* Array block 1: Declaring a new array using braces. *@
@{
    <h3>Team Members</h3>
    string[] teamMembers = {"Matt", "Joanne", "Robert", "Nancy"};
    foreach (var person in teamMembers)
    {
        <p>@person</p>
    }
}

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

@{
    string[] teamMembers = {"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>
    foreach (var name in teamMembers)
    {
        <p>@name</p>
    }
    <h3>Reversed order of team members in the list</h3>
    Array.Reverse(teamMembers);
    foreach (var reversedItem in teamMembers)
    {
        <p>@reversedItem</p>
    }
}

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

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

Razor-Img13

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

@{
    var myScores = new Dictionary<string, int>();
    myScores.Add("test1", 71);
    myScores.Add("test2", 82);
    myScores.Add("test3", 100);
    myScores.Add("test4", 59);
}
<p>My score on test 3 is: @myScores["test3"]%</p>
@{myScores["test4"] = 79;}
<p>My corrected score on test 4 is: @myScores["test4"]%</p>

若要建立字典,您可以使用 new 關鍵字來指出您要建立新的字典物件。 您可以使用 關鍵字,將字典指派給變數 var 。 您可以使用角括弧來指出字典中專案的資料類型, < > () 。 在宣告結束時,您必須加入一對括弧,因為這是建立新字典的方法。

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

myScores["test4"] = 79;

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

var testScoreThree = myScores["test3"];

使用參數呼叫方法

如您稍早在本文中所閱讀,您用來撰寫的物件可以有方法。 例如, Database 物件可能有 Database.Connect 方法。 許多方法也有一或多個參數。 參數是您傳遞至 方法的值,可讓 方法完成其工作。 例如,查看 方法的 Request.MapPath 宣告,其採用三個參數:

public string MapPath(string virtualPath, string baseVirtualDir, 
    bool allowCrossAppMapping);

(行已包裝,使其更容易閱讀。請記住,除了以引號括住的字串內,您可以放置分行符號,幾乎任何位置。)

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

Razor 語法提供兩個選項,讓您將參數傳遞至方法: 位置參數具名參數。 若要使用位置參數呼叫方法,請以方法宣告中指定的嚴格順序傳遞參數。 (您通常會閱讀 method 的檔來知道此順序。) 您必須遵循順序,而且您無法略過任何參數, 如有必要,您會將空字串傳遞 ("") 或 null 您沒有值的位置參數。

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

@{
    // Pass parameters to a method using positional parameters.
    var myPathPositional = Request.MapPath("/scripts", "/", true);
}
<p>@myPathPositional</p>

當方法有許多參數時,您可以使用具名參數讓程式碼更容易閱讀。 若要使用具名參數呼叫方法,您可以指定參數名稱,後面接著冒號 (:) ,然後指定值。 具名參數的優點是您可以依您想要的任何順序傳遞它們。 (缺點是方法呼叫不是 compact.)

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

@{
    // Pass parameters to a method using named parameters.
    var myPathNamed = Request.MapPath(baseVirtualDir: "/", 
        allowCrossAppMapping: true, virtualPath: "/scripts");
}
<p>@myPathNamed</p>

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

處理錯誤

Try-Catch 語句

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

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

在程式設計方面,這些情況稱為 例外狀況。 如果您的程式碼遇到例外狀況,它會產生 (擲回) 錯誤訊息,最好是對使用者很抱歉:

Razor-Img14

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

注意

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

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

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

@{
    var dataFilePath = "~/dataFile.txt";
    var fileContents = "";
    var physicalPath = Server.MapPath(dataFilePath);
    var userMessage = "Hello world, the time is " + DateTime.Now;
    var userErrMsg = "";
    var errMsg = "";

    if(IsPost)
    {
        // When the user clicks the "Open File" button and posts
        // the page, try to open the created file for reading.
        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 (FileNotFoundException ex) {
            // You can use the exception object for debugging, logging, etc.
            errMsg = ex.Message;
            // Create a friendly error message for users.
            userErrMsg = "A file could not be opened, please contact "
                + "your system administrator.";
        }
        catch (DirectoryNotFoundException ex) {
            // Similar to previous exception.
            errMsg = ex.Message;
            userErrMsg = "A directory was not found, please contact "
                + "your system administrator.";
        }
    }
    else
    {
        // The first time the page is requested, create the text file.
        File.WriteAllText(physicalPath, userMessage);
    }
}

<!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>

其他資源

使用 Visual Basic 進行程式設計

附錄:Visual Basic 語言和語法

參考文件

ASP.NET

C# 語言