Razor 構文 (C#) を使用して ASP.NET Web プログラミングの概要

Tom FitzMacken

この記事では、Razor 構文を使ったASP.NET Web ページにおけるプログラミングの概要を解説します。 ASP.NETは、Webサーバーで動的な Web ページを運用するためのマイクロソフトの技術です。 この記事を使用して C# のプログラミング言語での焦点を当てます。

学習内容:

  • Razor構文を使ったASP.NET Webページのプログラミングをはじめるための上位8つのプログラミング Tips
  • 必要とする基本的なプログラミング概念
  • ASP.NETサーバーコードとRazor構文に関する全体像

ソフトウェアのバージョン

  • ASP.NET Web ページ (Razor) 3

このチュートリアルは ASP.NET Web ページ2でも動作します。

8 つのプログラミング Tips

このセクションでは、Razor 構文を使用して ASP.NET サーバーコードの記述を開始するときに理解しておく必要があるいくつかのヒントを示します。

Note

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

Tip

HTML エンコード

前の例のように @ 文字を使用してページにコンテンツを表示すると、ASP.NET は出力を HTML エンコードします。 これにより、予約された HTML 文字 (<>&など) が、HTML タグまたはエンティティとして解釈されるのではなく、web ページに文字として表示されるようにするコードに置き換えられます。 HTML エンコードを使用しないと、サーバーコードからの出力が正しく表示されず、ページがセキュリティ上のリスクにさらされる可能性があります。

タグをマークアップとしてレンダリングする HTML マークアップを出力することが目的である場合 (たとえば、段落や <em></em> テキストを強調するための <p></p>)、この記事で後述する「コードブロック内のテキスト、マークアップ、およびコードの結合」セクションを参照してください。

HTML エンコードの詳細については、「フォームの操作」を参照してください。

2. コードブロックを中かっこで囲みます

コードブロックには、1つまたは複数のコードステートメントが含まれ、中かっこで囲まれています。

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

Note

@ 文字が、でC#逐語的文字列リテラルをマークし、ASP.NET ページのコードをマークするために使用されていることに注意してください。

6. コードで大文字と小文字を区別する

でC#は、キーワード (vartrueifなど) と変数名は大文字と小文字が区別されます。 次のコード行では、lastNameLastName. の2つの異なる変数を作成しています。

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

変数を var lastName = "Smith"; として宣言し、その変数を @LastNameとしてページ内で参照しようとすると、"Smith"ではなく "Jones" 値が取得されます。

Note

Visual Basic では、キーワードと変数の大文字と小文字は区別されません

7. コーディングの多くがオブジェクトを含む

オブジェクトは、ページ、テキストボックス、ファイル、 —画像、web 要求、電子メールメッセージ、顧客レコード (データベース行) などを使用してプログラミングできることを表します。オブジェクトには、その特性を説明するプロパティがあります。 —また、テキストボックスオブジェクトの読み取りまたは変更には、Text プロパティがあります。また、要求オブジェクトには Url プロパティがあり、電子メールメッセージには From プロパティがあり、顧客オブジェクトには FirstName プロパティがあります。 オブジェクトには、実行できる" "動詞であるメソッドもあります。 例としては、ファイルオブジェクトの Save メソッド、イメージオブジェクトの Rotate メソッド、電子メールオブジェクトの Send メソッドなどがあります。

多くの場合、Request オブジェクトを使用します。このオブジェクトは、ページ上のテキストボックス (フォームフィールド) の値、要求を行ったブラウザーの種類、ページの URL、ユーザー id などの情報を提供します。次の例は、Request オブジェクトのプロパティにアクセスする方法と、Request オブジェクトの MapPath メソッドを呼び出す方法を示しています。これにより、サーバー上のページの絶対パスが得られます。

<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. 決定を行うコードを記述できます。

動的 web ページの重要な機能は、条件に基づいて何を行うかを決定できることです。 これを行う最も一般的な方法は、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

Tip

HTTP GET メソッドと POST メソッド、および IsPost プロパティ

Web ページ (HTTP) に使用されるプロトコルでは、サーバーへの要求を行うために使用されるメソッド (動詞) の数が制限されています。 最も一般的な2つの方法は、ページの読み取りに使用される GET と、ページの送信に使用される POST です。 一般に、ユーザーが初めてページを要求したときは、GET を使用してページが要求されます。 ユーザーがフォームに入力し、[送信] ボタンをクリックすると、ブラウザーはサーバーに POST 要求を行います。

Web プログラミングでは、ページの処理方法を把握できるように、ページが GET として要求されているのか、または投稿として要求されているのかを知ることが役に立つことがよくあります。 ASP.NET Web ページでは、IsPost プロパティを使用して、要求が GET または POST のどちらであるかを確認できます。 要求が POST の場合、IsPost プロパティは true を返し、フォームのテキストボックスの値を読み取るなどの操作を実行できます。 多くの例では、IsPostの値に応じて、ページを異なる方法で処理する方法を示しています。

単純なコード例

この手順では、基本的なプログラミング手法を示すページを作成する方法について説明します。 この例では、ユーザーが2つの数値を入力できるページを作成し、それらを追加して結果を表示します。

  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. ページを保存し、ブラウザーで実行します。 (実行する前に、 [ファイル] ワークスペースでページが選択されていることを確認してください)。2つの整数を入力し、 [追加] ボタンをクリックします。

    Razor-Img7

基本的なプログラミングの概念

この記事では、ASP.NET web プログラミングの概要について説明します。 これは完全な検査ではなく、最も頻繁に使用するプログラミングの概念を簡単に説明します。 それでも、ASP.NET Web ページの使用を開始するために必要なほとんどすべてのことが説明されています。

しかし、まず少し技術的な背景です。

Razor 構文、サーバーコード、および ASP.NET

Razor 構文は、web ページにサーバーベースのコードを埋め込むための単純なプログラミング構文です。 Razor 構文を使用する web ページでは、クライアントコンテンツとサーバーコードという2種類のコンテンツがあります。 クライアントコンテンツは、HTML マークアップ (要素)、CSS などのスタイル情報、JavaScript などのクライアントスクリプト、プレーンテキストなど、web ページで使用するものです。

Razor 構文を使用すると、このクライアントコンテンツにサーバーコードを追加できます。 ページにサーバーコードがある場合、サーバーはそのコードを最初に実行してから、ブラウザーにページを送信します。 サーバー上で実行することにより、このコードでは、サーバーベースのデータベースへのアクセスなど、クライアントコンテンツのみを使用することにより複雑なタスクを実行できます。 ほとんどの場合、サーバーコードは動的にクライアント—コンテンツを作成できます。これにより、HTML マークアップやその他のコンテンツをその場で生成し、そのページに含まれる静的な html と共にブラウザーに送信できます。 ブラウザーの観点からは、サーバーコードによって生成されるクライアントコンテンツは、他のクライアントコンテンツと同じではありません。 既に説明したように、必要なサーバーコードは非常に単純です。

Razor 構文を含む web ページの ASP.NET には、特殊なファイル拡張子 (cshtmlまたはvbhtml) があります。 サーバーはこれらの拡張機能を認識し、Razor 構文でマークされているコードを実行してから、ブラウザーにページを送信します。

ASP.NET はどこにありますか。

Razor 構文は、ASP.NET と呼ばれる Microsoft のテクノロジに基づいています。このテクノロジは、Microsoft .NET フレームワークに基づいています。 The.NET Framework は、ほぼすべての種類のコンピューターアプリケーションを開発するための、Microsoft の大きな包括的なプログラミングフレームワークです。 ASP.NET は、web アプリケーションの作成専用に設計された .NET Framework の一部です。 開発者は ASP.NET を使用して、世界中の最大規模で最大規模の web サイトを作成しました。 (サイトの URL の一部としてファイル名拡張子 .aspxが表示されると、サイトが ASP.NET を使用して書き込まれたことがわかります)。

Razor 構文は、ASP.NET のすべての機能を提供しますが、初心者であり、専門家の方が生産性を向上させる簡単な構文を使用します。 この構文は簡単に使用できますが、ASP.NET と .NET Framework との家族の関係は、web サイトがより高度なものになったときに、より大きなフレームワークの機能を利用できることを意味します。

Razor-Img8

Tip

クラスとインスタンス

ASP.NET サーバーコードは、クラスの概念に基づいて構築されたオブジェクトを使用します。 クラスは、オブジェクトの定義またはテンプレートです。 たとえば、アプリケーションには、顧客オブジェクトが必要とするプロパティとメソッドを定義する Customer クラスが含まれている場合があります。

アプリケーションが実際の顧客情報を処理する必要がある場合は、customer オブジェクトのインスタンス (またはインスタンス) を作成します。 個々の顧客は、Customer クラスの個別のインスタンスです。 すべてのインスタンスは同じプロパティとメソッドをサポートしますが、各顧客オブジェクトが一意であるため、各インスタンスのプロパティ値は通常異なります。 1つの customer オブジェクトでは、LastName プロパティが "Smith" である場合があります。別の customer オブジェクトでは、LastName プロパティが "Jones" である場合があります。

同様に、サイト内の個々の web ページは、Page クラスのインスタンスである Page オブジェクトです。 ページ上のボタンは、Button クラスのインスタンスである Button のオブジェクトです。 各インスタンスには独自の特性がありますが、これらはすべて、オブジェクトのクラス定義で指定されている内容に基づいています。

基本構文

前に、ASP.NET Web ページページを作成する方法の基本的な例と、HTML マークアップにサーバーコードを追加する方法について説明しました。 ここでは、プログラミング言語の規則である Razor 構文—を使用して、ASP.NET サーバーコードを記述する方法の基本について説明します。

(特に C、C++、C#、Visual Basic、または JavaScript を使用した) 場合のプログラミング経験豊富な場合は、ここで読んだの多くが使い慣れたになります。 場合によっては、ファイル内のマークアップにサーバーコードを追加する方法についてのみ理解しておく必要があります。

コードブロック内のテキスト、マークアップ、およびコードの結合

サーバーコードブロックでは、多くの場合、テキストまたはマークアップ (またはその両方) をページに出力します。 サーバーコードブロックにコード以外のテキストが含まれていて、そのテキストをそのように表示する必要がある場合、ASP.NET はそのテキストをコードから区別できる必要があります。 これにはいくつかの方法があります。

  • テキストを <p></p><em></em>などの HTML 要素で囲みます。

    @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 タグを含む1行のコンテンツを出力します。<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>
    }
    

    最初の例では、前の例を繰り返しますが、1組の <text> タグを使用して、レンダリングするテキストを囲みます。 2番目の例では、<text> タグと </text> タグは3つの行を囲みます。これらの行には、非包含テキストと一致しない HTML タグ (<br />) と、サーバーコードおよび一致した HTML タグがあります。 繰り返しになりますが、各行の前に @: 演算子を使用することもできます。どちらの方法でも動作します。

    Note

    HTML 要素を使用して、このセクション—に示すようにテキストを出力する場合、@: 演算子、 —または <text> 要素 ASP.NET は、出力を html エンコードしません。 (前述のように、ASP.NET は、このセクションに記載されている特殊なケースを除き、@の前にあるサーバーコード式とサーバーコードブロックの出力をエンコードします)。

空白文字

ステートメント内の余分なスペース (および文字列リテラルの外部) は、ステートメントに影響しません。

@{ var lastName =    "Smith"; }

ステートメント内の改行は、ステートメントには影響しません。また、ステートメントをラップして読みやすくすることもできます。 次の 2 つのステートメントでは同じ結果が得られます。

@{ var theName =
"Smith"; }

@{
    var
    personName
    =
    "Smith"
    ;
}

ただし、文字列リテラルの途中では、行をラップすることはできません。 次の例は機能しません。

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

上のコードのように、折り返される長い文字列を複数の行に結合するには、2つのオプションがあります。 連結演算子 (+) を使用できます。これについては、この記事の後半で説明します。 この記事で既に説明したように、@ 文字を使用して逐語的文字列リテラルを作成することもできます。 逐語的文字列リテラルは、次のように行を越えて分割できます。

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

コード (およびマークアップ) のコメント

コメントを使用すると、自分や他のユーザーにメモを残すことができます。 また、実行するのではなく、ページ内に保持する必要のあるコードまたはマークアップを無効 (コメントアウト) することもできます。

Razor コードと HTML マークアップには、それぞれ異なるコメント構文があります。 すべての Razor コードと同様に、ページがブラウザーに送信される前に、Razor コメントがサーバー上で処理され、削除されます。 したがって、Razor コメントの構文を使用すると、ファイルを編集するときに表示できるコメントをコード (またはマークアップにも) に含めることができますが、ユーザーにはページソース内であっても表示されません。

ASP.NET Razor コメントの場合は、@* でコメントを開始し、*@で終了します。 コメントは、1行または複数行にすることができます。

@*  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#同様に、コメントはブラウザーに表示されません)。

ご存知のように、マークアップでは、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など) を指定できます。 他にもさまざまなデータ型を使用できます。

ただし、通常は変数の型を指定する必要はありません。 ほとんどの場合、ASP.NET は変数のデータがどのように使用されているかに基づいて型を特定できます。 (場合によっては、型を指定する必要があります。これが当てはまる例があります)。

変数を宣言するには、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);
}

次の例は、web ページでの変数の一般的な使用例を示しています。

@{
    // 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>
}

前の例を1つのページで組み合わせると、次のような画面がブラウザーに表示されます。

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 は2つの文字列を追加できないため、次のエラーが発生します。

型 ' 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" などの10進数値を持つ文字列を浮動小数点数に変換します。

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

AsDecimal(), IsDecimal()

"1.3" または "7.439" などの10進数値を持つ文字列を10進数に変換します。 (ASP.NET では、10進数は浮動小数点数よりも正確です)。

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 を返します。 (= 演算子と == 演算子の違いに注意してください)。

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

.

.Dot. オブジェクトとそのプロパティおよびメソッドを区別するために使用されます。

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.
}

コードでのファイルとフォルダーのパスの操作

多くの場合、コードでファイルとフォルダーのパスを操作します。 開発用コンピューターに表示される web サイトの物理フォルダー構造の例を次に示します。

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
サーバー名 my企業サーバー
[仮想パス] /humanresources/CompanyPolicy.htm
物理パス C:\mywebsites\humanresources\CompanyPolicy.htm

仮想ルートは/です。 C: ドライブのルートと同じです。 (仮想フォルダーパスは常にスラッシュを使用します)。フォルダーの仮想パスは、物理フォルダーと同じ名前である必要はありません。エイリアスにすることができます。 (実稼働サーバーでは、仮想パスが正確な物理パスと一致することはほとんどありません)。

コード内でファイルやフォルダーを操作するときに、使用しているオブジェクトに応じて、物理パスと仮想パスを参照することが必要になる場合があります。 ASP.NET には、コード内のファイルとフォルダーのパスを操作するためのツールが用意されています。 Server.MapPath メソッド、~ 演算子、および Href メソッドです。

仮想パスから物理パスへの変換: サーバーの MapPath メソッド

Server.MapPath メソッドは、仮想パス (C:\WebSites\MyWebSiteFolder\default.cshtml など ) を絶対物理パス (たとえば、) に変換します。 この方法は、完全な物理パスが必要な場合にいつでも使用できます。 一般的な例として、web サーバー上のテキストファイルまたはイメージファイルを読み取ったり書き込んだりする場合があります。

通常、ホストサイトのサーバー上にあるサイトの絶対物理パスがわからないため、この方法では、既知のパス (仮想パス) をサーバー上の対応するパスに変換できます。 ファイルまたはフォルダーへの仮想パスをメソッドに渡し、物理パスを返します。

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

仮想ルートの参照: ~ 演算子と Href メソッド

Cshtmlファイルまたはvbhtmlファイルでは、~ 演算子を使用して仮想ルートパスを参照できます。 これは、サイト内でページを移動することができ、他のページに含まれているすべてのリンクが破損しないため、非常に便利です。 また、web サイトを別の場所に移動した場合にも便利です。 次に例をいくつか示します。

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

Web サイトが 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" />

マークアップでは、~ 演算子を使用して、イメージファイル、その他の web ページ、CSS ファイルなどのリソースへのパスを作成します。 ページが実行されると、ASP.NET はページ (コードとマークアップの両方) を参照し、適切なパスへのすべての ~ 参照を解決します。

条件付きロジックとループ

ASP.NET server code を使用すると、条件に基づいてタスクを実行し、ステートメントを特定の回数 (ループを実行するコード) に繰り返すコードを記述することができます。

テスト条件

単純な条件をテストするには、if ステートメントを使用します。これは、指定したテストに基づいて true または false を返します。

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

if キーワードはブロックを開始します。 実際のテスト (条件) はかっこ内にあり、true または false を返します。 テストが true の場合に実行されるステートメントは、中かっこで囲まれます。 if ステートメントには、条件が false の場合に実行するステートメントを指定する else ブロックを含めることができます。

@{
  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 if ブロックを追加して、他のすべての" 条件 "として 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 ブロックに break を含め忘れた場合、次の case ステートメントのコードも実行されます)。switch ブロックには、多くの場合、" "の最後のケースとして default ステートメントが含まれています。それ以外の場合は、他のいずれのケースも true ではありません。

ブラウザーに表示された最後の2つの条件ブロックの結果:

Razor-Img10

ループコード

多くの場合、同じステートメントを繰り返し実行する必要があります。 これを行うには、ループを使用します。 たとえば、多くの場合、データのコレクション内の各項目に対して同じステートメントを実行します。 ループする回数が正確にわかっている場合は、for ループを使用できます。 この種類のループは、カウントアップまたはカウントする場合に特に役立ちます。

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

ループは for キーワードで始まり、その後に3つのステートメントがかっこで囲まれ、それぞれがセミコロンで終了します。

  • かっこ内では、最初のステートメント (var i=10;) によってカウンターが作成され、10に初期化されます。 カウンターに名前を付ける必要はあり—ません i 任意の変数を使用できます。 for ループが実行されると、カウンターが自動的にインクリメントされます。
  • 2番目のステートメント (i < 21;) では、カウントする条件を設定します。 このケースでは、最大20にまで移動します (つまり、カウンターが21未満である間は継続します)。
  • 3番目のステートメント (i++) では、インクリメント演算子を使用します。これは、ループが実行されるたびにカウンターに1が追加されることを指定するだけです。

中かっこ内には、ループの反復ごとに実行されるコードが含まれています。 マークアップは、毎回新しい段落 (<p> 要素) を作成し、出力に行を追加して i (カウンター) の値を表示します。 このページを実行すると、この例では、出力を表示する11行を作成し、アイテム番号を示す各行にテキストを入力します。

Razor-Img11

コレクションまたは配列を使用して作業している場合は、多くの場合、foreach ループを使用します。 コレクションは、類似したオブジェクトのグループであり、foreach ループを使用すると、コレクション内の各項目に対してタスクを実行できます。 この種類のループは、for ループとは異なり、カウンターをインクリメントしたり制限を設定したりする必要がないため、コレクションに便利です。 代わりに、foreach ループコードは、完了するまでコレクションを処理します。

たとえば、次のコードは、Request.ServerVariables コレクション内の項目を返します。これは、web サーバーに関する情報を格納するオブジェクトです。 foreac h ループを使用して、HTML の箇条書きに新しい <li> 要素を作成することによって各項目の名前を表示します。

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

foreach キーワードの後に、コレクション内の1つの項目 (例では var item) を表す変数を宣言し、続いて in キーワードを入力した後、ループするコレクションを指定します。 foreach ループの本体では、前に宣言した変数を使用して現在の項目にアクセスできます。

Razor-Img12

より汎用的なループを作成するには、while ステートメントを使用します。

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

while ループは、while キーワードで始まり、その後に、ループの継続時間 (ここでは countNum が50未満である限り) を指定します。次に、繰り返します。 ループは通常、カウントに使用される変数またはオブジェクトをインクリメント (加算) またはデクリメント (減算) します。 この例では、+= 演算子は、ループが実行されるたびに countNum に1を加算します。 (カウントダウンするループ内で変数をデクリメントするには、デクリメント演算子 -=) を使用します。

オブジェクトとコレクション

ASP.NET web サイトのほぼすべてのものは、web ページ自体を含むオブジェクトです。 このセクションでは、コード内で頻繁に使用するいくつかの重要なオブジェクトについて説明します。

Page オブジェクト

ASP.NET の最も基本的なオブジェクトはページです。 ページオブジェクトのプロパティには、修飾されたオブジェクトを使用せずに直接アクセスできます。 次のコードは、ページの Request オブジェクトを使用して、ページのファイルパスを取得します。

@{
    var path = Request.FilePath;
}

現在の page オブジェクトのプロパティとメソッドを参照していることを明確にするために、必要に応じて this キーワードを使用して、コード内のページオブジェクトを表すことができます。 次に示すのは、上記のコード例です。ページを表すために this が追加されています。

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

Page オブジェクトのプロパティを使用して、次のような大量の情報を取得できます。

  • https://login.microsoftonline.com/consumers/ 既に説明したように、これは現在の要求に関する情報のコレクションです。要求を行ったブラウザーの種類、ページの URL、ユーザー id などが含まれます。

  • https://login.microsoftonline.com/consumers/ これは、サーバーコードの実行が終了したときにブラウザーに送信される応答 (ページ) に関する情報のコレクションです。 たとえば、このプロパティを使用して、応答に情報を書き込むことができます。

    @{
        // 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 コレクションのような多くの組み込みコレクションが含まれています。

多くの場合、コレクション内のデータを操作します。 2つの一般的なコレクション型は、配列ディクショナリです。 配列は、類似した項目のコレクションを格納するが、各項目を保持するための個別の変数を作成しない場合に便利です。

@* 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 —から始まります。つまり、最初の項目の位置は0、2番目の項目は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 キーワードを使用して、変数に辞書を割り当てることができます。 ディクショナリ内の項目のデータ型は、山かっこ (< >) を使用して指定します。 宣言の最後に、かっこのペアを追加する必要があります。これは、実際には新しいディクショナリを作成するメソッドであるためです。

ディクショナリに項目を追加するには、ディクショナリ変数 (この場合はmyScores) の Add メソッドを呼び出して、キーと値を指定します。 また、次の例のように、角かっこを使用してキーを指定し、単純な割り当てを行うこともできます。

myScores["test4"] = 79;

ディクショナリから値を取得するには、キーを角かっこで囲んで指定します。

var testScoreThree = myScores["test3"];

パラメーターを使用したメソッドの呼び出し

この記事の前半で説明したように、を使用してプログラミングするオブジェクトには、メソッドを含めることができます。 たとえば、Database オブジェクトには、Database.Connect メソッドがある場合があります。 多くのメソッドには、1つまたは複数のパラメーターもあります。 パラメーターは、メソッドがタスクを完了できるようにメソッドに渡す値です。 たとえば、Request.MapPath メソッドの宣言を見て、次の3つのパラメーターを取得します。

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

(行は、読みやすくするために折り返されています。 改行は、引用符で囲まれた文字列内を除き、ほぼすべての場所に配置することができます)。

このメソッドは、指定された仮想パスに対応するサーバー上の物理パスを返します。 メソッドの3つのパラメーターは、virtualPathbaseVirtualDir、および allowCrossAppMappingです。 (宣言では、パラメーターが、受け入れられるデータのデータ型と共に一覧表示されていることに注意してください)。このメソッドを呼び出す場合は、3つのすべてのパラメーターの値を指定する必要があります。

Razor 構文には、メソッドにパラメーターを渡す方法として、位置指定パラメーターと名前付きパラメーターの2つのオプションが用意されています。 位置指定パラメーターを使用してメソッドを呼び出すには、メソッド宣言で指定された厳密な順序でパラメーターを渡します。 (通常、この順序については、メソッドのドキュメントを参照してください)。順序に従う必要があります。また、必要に応じて—パラメーターを省略することはできません。値のない位置指定パラメーターには、空の文字列 ("") または null を渡します。

次の例では、web サイトにscriptsという名前のフォルダーがあることを前提としています。 このコードは Request.MapPath メソッドを呼び出し、3つのパラメーターの値を正しい順序で渡します。 次に、結果としてマップされたパスが表示されます。

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

メソッドに多数のパラメーターがある場合は、名前付きパラメーターを使用してコードを読みやすくすることができます。 名前付きパラメーターを使用してメソッドを呼び出すには、パラメーター名の後にコロン (:) を指定し、その後に値を指定します。 名前付きパラメーターの利点は、任意の順序で渡すことができることです。 (欠点は、メソッドの呼び出しがコンパクトではないことです)。

次の例では、上記と同じメソッドを呼び出しますが、名前付きパラメーターを使用して値を指定します。

@{
    // 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 ステートメントでは、チェックしているコードを実行します。 1つ以上の catch ステートメントでは、発生した可能性のある特定のエラー (特定の種類の例外) を検索できます。 予測しているエラーを検索するために必要な数の catch ステートメントを含めることができます。

Note

try/catch ステートメントでは Response.Redirect メソッドを使用しないことをお勧めします。これは、ページで例外が発生する可能性があるためです。

次の例は、最初の要求でテキストファイルを作成し、ユーザーがファイルを開くためのボタンを表示するページを示しています。 この例では、例外が発生するように、不適切なファイル名を意図的に使用しています。 このコードには catch 2 つの例外のステートメントが含まれています。 FileNotFoundExceptionは、ファイル名が正しくない場合に発生します。また、ASP.NET がフォルダーを検索できない場合に発生する DirectoryNotFoundExceptionです。 (例では、すべてが正常に動作するときに実行方法を確認するために、ステートメントのコメントを解除できます)。

コードで例外が処理されなかった場合は、前のスクリーンショットのようなエラーページが表示されます。 ただし、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#言語