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

Tom FitzMacken

この記事では、Razor 構文を使用した ASP.NET Web ページを使用したプログラミングの概要について説明します。 ASP.NET は、Web サーバー上で動的 Web ページを実行するための Microsoft のテクノロジです。 この記事では、C# プログラミング言語の使用に焦点を当てています。

学習内容:

  • Razor 構文を使用したプログラミング ASP.NET Web ページの使用を開始するための上位 8 つのプログラミングヒント。
  • 必要な基本的なプログラミングの概念。
  • サーバー コードと Razor 構文 ASP.NET すべてについて説明します。

ソフトウェア バージョン

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

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

プログラミングに関するトップ 8 のヒント

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

Note

Razor 構文は C# プログラミング言語に基づいており、ASP.NET Web ページで最もよく使用される言語です。 ただし、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 タグまたはエンティティとして解釈されるのではなく、Web ページに文字として表示されるコードに置き換えられます。 HTML エンコードがないと、サーバー コードからの出力が正しく表示されず、ページがセキュリティ 上のリスクにさらされる可能性があります。

タグをマークアップとしてレンダリングする HTML マークアップ (段落の場合やテキストを強調する場合など<p></p>) を出力することが目的の場合は、この記事の後半の「コード ブロックでのテキスト、マークアップ、コードの組み合わせ」セクションを参照してください。<em></em>

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. 変数を使用して値を格納する

文字列、数値、日付などの値を変数に格納できます。キーワード (keyword)を使用して新しい変数を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# では、キーワード (、true、および などvar) と変数名は大文字とif小文字が区別されます。 次のコード行は、 lastName 2 つの異なる変数を作成します。 LastName.

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

ヒント

HTTP GET メソッドと POST メソッドと IsPost プロパティ

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

Web プログラミングでは、ページを処理する方法を知るために、ページが GET または POST として要求されているかどうかを把握すると便利です。 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 に置きます。
    • ページの上部にあるブロックは中かっこで囲まれています。
    • 上部の ブロックでは、すべての行がセミコロンで終わります。
    • 変数 total、、 num1num2および 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 種類のコンテンツがあります。 クライアント コンテンツは、Web ページで使い慣れたものです。HTML マークアップ (要素)、CSS などのスタイル情報、JavaScript などのクライアント スクリプト、プレーン テキストなどです。

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

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

ASP.NET はどこに収まりますか?

Razor 構文は、ASP.NET と呼ばれる Microsoft のテクノロジに基づいており、Microsoft .NET Frameworkに基づいています。 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

ヒント

クラスとインスタンス

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

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

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

基本構文

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

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

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

サーバー コード ブロックでは、多くの場合、テキストまたはマークアップ (またはその両方) をページに出力する必要があります。 サーバー コード ブロックにコードではないテキストが含まれており、代わりにそのままレンダリングする必要がある場合は、そのテキストをコードと区別できる必要 ASP.NET。 これを行うには、いくつかの方法があります。

  • <em></em>のような <p></p> 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# では、1 行のコメントの前に // 文字が付き、複数行のコメントは で /* 始まり、 で */終わります。 (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 など)、さまざまな形式 (2012 年 4 月 12 日や 2009 年 3 月など) で日付値を格納する日付変数を指定できます。 また、他にも多くのデータ型を使用できます。

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

変数は、(型をvar指定しない場合は) キーワード (keyword)を使用するか、型の名前を使用して宣言します。

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

前の例をページに組み合わせると、ブラウザーに表示されます。

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();
    }
}

原則として、ユーザー入力は文字列として表示されます。 ユーザーに数値の入力を求め、数字を入力した場合でも、ユーザー入力を送信してコードで読み取った場合でも、データは文字列形式になります。 したがって、文字列を数値に変換する必要があります。 この例では、値を変換せずに算術演算を実行しようとすると、2 つの文字列を追加できないため、次 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" などの 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 示すキーワード (keyword)または文字です。 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

.

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

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

()

かっこ。 式をグループ化し、パラメーターをメソッドに渡すために使用します。

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

[]

ブラケット。 配列またはコレクション内の値にアクセスするために使用されます。

var income = Request["AnnualIncome"];

!

Not。 値を truefalse 反転し、その逆を行います。 通常、 をテスト 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.comhttp://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 など) に変換します。 完全な物理パスが必要な場合は、いつでもこのメソッドを使用します。 一般的な例は、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 サーバー コードを使用すると、条件に基づいてタスクを実行し、ステートメントを特定の回数繰り返すコード (つまり、ループを実行するコード) を記述できます。

テスト条件

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

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

キーワード (keyword)は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 ステートメントが実行されます。 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 ブロックには、他のいずれのケースも当てはまらない場合に実行される "その他のすべて" オプションの最後のケースとして ステートメントがあります。

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

Razor-Img10

ループ コード

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

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

ループはキーワード (keyword)で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 サーバーに関する情報を含む オブジェクトです。 h ループを foreac 使用して、HTML 箇条書きリストに新しい <li> 要素を作成して各項目の名前を表示します。

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

foreach キーワード (keyword)の後にかっこが続き、コレクション内の 1 つの項目を表す変数 (例では ) を宣言し、var itemその後inにキーワード (keyword)を続け、ループ処理するコレクションを宣言します。 ループの foreach 本体では、前に宣言した変数を使用して現在の項目にアクセスできます。

Razor-Img12

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

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

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

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

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

Page オブジェクト

ASP.NET の最も基本的なオブジェクトはページです。 対象となるオブジェクトがなくても、ページ オブジェクトのプロパティに直接アクセスできます。 次のコードは、ページの オブジェクトを使用して Request 、ページのファイル パスを取得します。

@{
    var path = Request.FilePath;
}

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

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

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

  • Request. 既に確認したように、これは、要求を行ったブラウザーの種類、ページの URL、ユーザー ID など、現在の要求に関する情報のコレクションです。

  • 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 含まれています。

多くの場合、コレクション内のデータを操作します。 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特定のデータ型を宣言します。 変数に配列を含めることができることを示すには、宣言に角かっこ (や int[]などstring[]) を追加します。 配列内の項目には、その位置 (インデックス) を使用するか、 ステートメントを foreach 使用してアクセスできます。 配列インデックスは 0 から始まります。つまり、1 番目の項目は 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.ReverseArray.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>

ディクショナリを作成するには、キーワード (keyword)をnew使用して、新しいディクショナリ オブジェクトを作成していることを示します。 キーワード (keyword)を使用して、変数にディクショナリをvar割り当てることができます。 山かっこ ( < > ) を使用して、ディクショナリ内の項目のデータ型を指定します。 これは実際には新しいディクショナリを作成するメソッドであるため、宣言の最後にかっこのペアを追加する必要があります。

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

myScores["test4"] = 79;

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

var testScoreThree = myScores["test3"];

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

この記事で前に説明したように、プログラムに使用するオブジェクトには メソッドを使用できます。 たとえば、オブジェクトに Database メソッドがあると Database.Connect します。 多くのメソッドには、1 つ以上のパラメーターもあります。 パラメーターは、メソッドがタスクを完了できるようにするためにメソッドに渡す値です。 たとえば、次の 3 つのパラメーターを受け取る メソッドの Request.MapPath 宣言を確認します。

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

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

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

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