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

作成者: Tom FitzMacken

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

学習内容:

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

ソフトウェア バージョン

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

このチュートリアルは、ASP.NET Web ページ 2 にも適用できます。

Razor 構文で ASP.NET Web ページを使用するほとんどの例では、C# を使用します。 ただし、Razor 構文では Visual Basic もサポートされています。 Visual Basic で ASP.NET Web ページをプログラミングするには、ファイル名に .vbhtml の拡張子を持つ Web ページを作成してから、Visual Basic コードを追加します。 この記事では、Visual Basic の言語と構文を使用して ASP.NET Web ページを作成する方法を概説します。

Note

Microsoft WebMatrix の既定の Web サイト用テンプレート (パン屋フォト ギャラリースターター サイトなど) は、C# バージョンでも Visual Basic バージョンでも使用できます。 NuGet パッケージとして Visual Basic テンプレートをインストールできます。 Web サイト テンプレートは、Microsoft Templates という名前のフォルダー内の、サイトのルート フォルダーにインストールされます。

上位 8 つのプログラミングのヒント

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

1.@ 文字を使用してページにコードを追加する

@ 文字は、インライン式、単一ステートメント ブロック、および複数ステートメント ブロックを開始するものです:

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

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

結果がブラウザーに表示されます:

Razor-Img1

ヒント

HTML エンコード

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

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

HTML エンコードの詳細については、「ASP.NET Web ページ サイトでの HTML フォームの操作」を参照してください。

2.コード ブロックを Code と End Code で囲む

コード ブロックには 1 つ以上のコード ステートメントが含まれており、キーワード Code および End Code で囲まれています。 @ 文字の直後に開始キーワード Code を配置します。それらの間に空白を入れることはできません。

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

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

結果がブラウザーに表示されます:

Razor-Img2

3.ブロック内では、各コード ステートメントを改行で終了する

Visual Basic コード ブロックでは、各ステートメントは改行で終わります。 (この記事の後半では、必要に応じて、長いコード ステートメントを複数行にラップする方法を説明します。)

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

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

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

4.変数を使用して値を格納する

文字列、数値、日付などの値を変数に格納できます。Dim キーワードを使用して新しい変数を作成します。 @ を使用して、変数値をページに直接挿入できます。

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

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

結果がブラウザーに表示されます:

Razor-Img3

5.リテラル文字列の値を二重引用符で囲みます

文字列は、テキストとして扱われる文字のシーケンスです。 文字列を指定するには、二重引用符で囲みます:

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

文字列値に二重引用符を埋め込むには、2 つの二重引用符文字を挿入します。 ページ出力に二重引用符を 1 回表示するには、引用符で囲まれた文字列内に "" として入力し、2 回表示するには、引用符で囲まれた文字列内に """" として入力します。

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

結果がブラウザーに表示されます:

Razor-Img4

6.Visual Basic コードは大文字と小文字を区別しない

Visual Basic 言語では大文字と小文字は区別されません。 プログラミング キーワード (DimIfTrue など) と変数名 (myStringsubTotal など) は、大文字小文字の区別なく記述できます。

次のコード行では、小文字の名前を使用して変数 lastname に値を代入し、大文字の名前を使用して変数の値をページに出力します。

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

結果がブラウザーに表示されます:

vb-syntax-5

7.コーディングの多くはオブジェクトの操作を伴う

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

多くの場合、Request オブジェクトを操作します。これは、ページ上のフォーム フィールド (テキスト ボックスなど) の値、要求を行ったブラウザーの種類、ページの URL、ユーザー 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 ステートメント) です。

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

ステートメント If IsPost は、簡単な If IsPost = True の記述方法です。 If ステートメントと共に、条件のテスト、コード ブロックの繰り返しなど、さまざまな方法があります。これについては、この記事で後述します。

結果がブラウザーに表示されます ([送信] をクリックした後):

Razor-Img6

ヒント

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

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

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

簡単なコード例

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

  1. エディターで新しいファイルを作成し、AddNumbers.vbhtml という名前を付けます。

  2. 次のコードとマークアップをページにコピーし、ページ内に既にあるものを置き換えます。

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

    注意すべき点を次に示します:

    • @ 文字は、ページ内のコードの最初のブロックを開始し、下部付近に埋め込まれた変数 totalMessage の前に置きます。
    • ページの上部にあるブロックは Code...End Code で囲まれます。
    • 変数 totalnum1num2totalMessage は複数の数値と文字列を格納します。
    • totalMessage 変数に割り当てられたリテラル文字列値は二重引用符で囲まれます。
    • Visual Basic コードでは大文字と小文字を区別しないため、ページの下部付近で変数 totalMessage を使用する場合、その名前はページ上部にある変数宣言のスペルと一致するだけで済みます。 大文字か小文字かは関係ありません。
    • num1.AsInt() + num2.AsInt() は、オブジェクトとメソッドを操作する方法を示しています。 各変数の AsInt メソッドは、ユーザーが入力した文字列を、追加できる整数に変換します。
    • <form> タグには method="post" 属性が含まれています。 これは、ユーザーが [追加] をクリックすると、HTTP POST メソッドを使用してページがサーバーに送信されることを指定します。 ページが送信されると、コード If IsPost は true に評価され、条件付きコードが実行され、数値を追加した結果が表示されます。
  3. ページを保存し、ブラウザーで実行します。 (実行する前に、ファイル ワークスペースでページが選択されていることを確認してください。)2 つの整数を入力し、[追加] ボタンをクリックします。

    Razor-Img7

Visual Basic の言語と構文

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

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

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

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

  • <p></p><em></em> のような HTML ブロック要素でテキストを囲みます:

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

    HTML 要素には、テキスト、追加の HTML 要素、およびサーバー コード式を含めることができます。 ASP.NET が HTML タグ (たとえば <p>) が開いているのを認識すると、要素とその内容がすべてそのままブラウザーにレンダリングされ、サーバー コード式が解決されます。

  • @: 演算子または <text> 要素を使用します。 @: は、プレーン テキストまたは一致しない HTML タグを含むコンテンツの 1 行を出力します。<text> 要素は複数行を囲み、出力します。 これらのオプションは、HTML 要素を出力の一部としてレンダリングしない場合に便利です。

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

    次の例では、前の例を繰り返しますが、1 組の <text> タグを使用して、レンダリングするテキストを囲みます。

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

    次の例では、<text> タグと </text> タグで 3 つの行が囲まれており、いずれにも、サーバー コードや、対を成す HTML タグに加えて、未整理のテキストや対を成さない HTML タグ (<br />) が含まれています。 ここでも、各行の前に @: 演算子を付けることもできます。どちらの方法でも動作します。

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

    Note

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

空白

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

@Code Dim personName =    "Smith"    End Code

長いステートメントを複数行に分割する

コードの各行の後にアンダースコア文字 _ (Visual Basic では "継続文字" と呼ばれます) を使用して、長いコード ステートメントを複数行に分割できます。 ステートメントを次の行に分割するには、行の末尾にスペースを追加してから継続文字を追加します。 次の行でステートメントを続行します。 読みやすくするために必要なだけの行数にステートメントを折り返すことができます。 次の 2 つのステートメントでは同じ結果が得られます:

@Code
    Dim familyName _
    =  "Smith" 
End Code

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

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

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

上記のコードのように複数の行に折り返される長い文字列を組み合わせるには、"連結演算子" (&) を使用する必要があります。これは、この記事で後述します。

コード コメント

コメントを使用すると、自分や他のユーザーにメモを残すことができます。 Razor 構文のコメントの前には @* が付き、末尾には *@ が付きます。

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

コード ブロック内では、Razor 構文コメントを使用することも、通常の Visual Basic コメント文字を使用することもできます。これは、各行の先頭に付く単一引用符 (') です。

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

変数

変数は、データの格納に使用する名前付きオブジェクトです。 変数には何でも名前を付けることができますが、名前は英文字で始まる必要があり、空白文字や予約文字を含めることはできません。 Visual Basic では、前に説明したように、変数名の文字が大文字か小文字かは関係ありません。

変数とデータ型

変数には、変数に格納されるデータ型を示す特定のデータ型を指定できます。 文字列値を格納する文字列変数 ("Hello world" など)、整数値を格納する整数変数 (3 や 79 など)、さまざまな形式 (2012 年 4 月 12 日や 2009 年 3 月など) で日付値を格納する日付変数を使用できます。 また、他にも多くのデータ型を使用できます。

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

型を指定せずに変数を宣言するには、Dim プラス変数名 (例: Dim myVar) を使用します。 型を使用して変数を宣言するには、Dim と変数名を使用し、As、型名 (例: Dim myVar As String) の順に続けます。

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

次の例は、Web ページで変数を使用するいくつかのインライン式を示しています。

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

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

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

結果がブラウザーに表示されます:

Razor-Img9

データ型の変換とテスト

ASP.NET は通常、データ型を自動的に決定できますが、できない場合があります。 そのため、明示的な変換を実行して ASP.NET を支援することが必要になる場合があります。 型を変換する必要がない場合でも、使用している可能性のあるデータの種類をテストして確認すると便利な場合があります。

最も一般的なケースは、文字列を整数や日付などの別の型に変換する必要があるということです。 次の例は、文字列を数値に変換する必要がある一般的なケースを示しています。

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

原則として、ユーザー入力は文字列として表示されます。 ユーザーに数値の入力を求め、ユーザーが数字を入力した場合でも、ユーザー入力が送信され、それをコードで読み取るとき、データは文字列形式になります。 したがって、文字列を数値に変換する必要があります。 この例では、ASP.NET が2つの文字列を加算できないため、値を変換せずに算術演算を実行しようとすると、次のようなエラーになります:

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

値を整数に変換するには、AsInt メソッドを呼び出します。 変換が成功した場合は、数値を追加できます。

次の表に、変数の一般的な変換メソッドとテスト メソッドを示します。

方法

説明


AsInt(), IsInt()

整数 ("593" など) を表す文字列を整数に変換します。

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

AsBool(), IsBool()

"true" や "false" などの文字列をブール型に変換します。

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

AsFloat(), IsFloat()

"1.3" や "7.439" などの 10 進値を持つ文字列を浮動小数点数に変換します。

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

AsDecimal(), IsDecimal()

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

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

AsDateTime(), IsDateTime()

日付と時刻の値を表す文字列を ASP.NET DateTime 型に変換します。

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

ToString()

その他のデータ型を文字列に変換します。

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

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

演算子

演算子は、式で実行するコマンドの種類 ASP.NET 示すキーワードまたは文字です。 Visual Basic では多くの演算子がサポートされていますが、ASP.NET Web ページの開発を開始するにはそのいくつかを認識しているだけで十分です。 次の表は、最も一般的な演算子をまとめたものです。

Operator

説明

使用例


+ - * /

数値式で使用される算術演算子。

@(5 + 13)

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

=

代入と等式。 コンテキストに応じて、ステートメントの右側の値を左側のオブジェクトに代入するか、値の等価性をチェックします。

Dim age = 17

Dim income = Request("AnnualIncome")

<>

非等値。 値が等しくない場合、True を返します。

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

< > <= >=

より小さい、より大きい、より小さいか等しい、およびより大きいか等しい。

If 2 < 3 Then
    ' Do something.
End If

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

&

文字列を結合するために使用される連結。

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

+= -=

インクリメント演算子とデクリメント演算子。変数からそれぞれ 1 を加算および減算します。

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

.

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

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

()

かっこ。 式をグループ化したり、パラメーターをメソッドに渡したり、配列やコレクションのメンバーにアクセスしたりするために使用されます。

@(3 + 7)

@Request.MapPath(Request.FilePath)

Not

ありません。 true の値を false に (またはその逆) 反転します。 通常、テスト False の短縮形として使用されます (つまり、True のテスト用ではありません)。

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

AndAlso OrElse

論理 AND と OR。条件をリンクするために使用されます。

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

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

多くの場合、コード内でファイルとフォルダーのパスを操作します。 開発用コンピューターに表示される 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
サーバー名 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 サーバーでテキスト ファイルまたはイメージ ファイルを読み書きする場合です。

通常、ホスティング サイトのサーバー上のサイトの絶対物理パスがわからないので、この方法では、知っているパス (仮想パス) をサーバー上の対応するパスに変換できます。 仮想パスををファイルに、またはフォルダーをメソッドに渡すと、物理パスが返されます:

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

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

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

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

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

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...Then ステートメントを使用します。これは、指定したテストに基づいて True または False を返します。

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

If キーワードはブロックを開始します。 実際のテスト (条件) は If キーワードに続き、true または false を返します。 If ステートメントは Then で終わります。 テストが true の場合に実行されるステートメントは、IfEnd If で囲まれます。 If ステートメントには、条件が false の場合に実行するステートメントを指定する Else ブロックを含めることができます:

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

If ステートメントがコード ブロックを開始する場合、通常の Code...End Code ステートメントを使用してブロックを含める必要はありません。 @ をブロックに追加するだけで、機能します。 このアプローチは、If だけでなく、ForFor EachDo While など、後にコード ブロックが続く他の Visual Basic プログラミング キーワードにより機能します。

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

1 つ以上の ElseIf ブロックを使用して、複数の条件を追加できます。

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

この例では、If ブロックの最初の条件が true でない場合、ElseIf 条件がチェックされます。 その条件が満たされると、ElseIf ブロック内のステートメントが実行されます。 条件が満たされていない場合は、Else ブロック内のステートメントが実行されます。 任意の数の ElseIf ブロックを追加し、"すべての他の" 条件として Else ブロックで閉じることができます。

多数の条件をテストするには、Select Case ブロックを使用します:

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

テストする値 (この例では、曜日変数) はかっこで囲まれています。 個々のテストでは、値を一覧表示する Case ステートメントを使用します。 Case ステートメントの値がテスト値と一致する場合、その Case ブロックのコードが実行されます。

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

Razor-Img10

ループ コード

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

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

ループは For キーワードで始まり、次の 3 つの要素が続きます。

  • For ステートメントの直後に、カウンター変数を宣言し (Dim を使用する必要はありません)、i = 10 to 20 のように範囲を指定します。 つまり、変数 i は 10 からカウントを開始し、20 (その値を含む) に達するまで続行されます。
  • For ステートメントと Next ステートメントの間に、ブロックの内容があります。 これには、各ループで実行される 1 つ以上のコード ステートメントを含めることができます。
  • Next i ステートメントはループを終了させます。 カウンターをインクリメントし、ループの次の反復を開始します。

For 行と Next 行の間のコード行には、ループの繰り返しごとに実行されるコードが含まれています。 マークアップは毎回新しい段落 (<p> 要素) を作成し、出力に行を追加し、i の値を表示します (カウンター)。 このページを実行すると、出力を表示する 11 行が作成され、各行に項目番号を示すテキストが表示されます。

Razor-Img11

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

次の例は、Request.ServerVariables コレクション内の項目 (Web サーバーに関する情報を含む) を返します。 For Each ループを使用して、HTML 箇条書きリストに新しい <li> 要素を作成し、各項目の名前を表示します。

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

For Each キーワードの後に、コレクション内の 1 つの項目 (例では myItem) を表す変数が続き、さらにその後に In キーワードが続いて、ループ処理する必要のあるコレクションが続きます。 For Each ループの本体では、前に宣言した変数を使用して現在の項目にアクセスできます。

Razor-Img12

より汎用的なループを作成するには、次の Do While ステートメントを使用します:

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

このループは Do While キーワードで始まり、その後に条件が続き、その後に繰り返すブロックが続きます。 ループは通常、カウントに使用される変数またはオブジェクトをインクリメント (加算) またはデクリメント (減算) します。 この例では、ループが実行されるたびに、+= 演算子によって変数の値に 1 が加算されます。 (カウントダウンするループ内の変数をデクリメントするには、デクリメント演算子 -= を使用します。)

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

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

Page オブジェクト

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

@Code
    Dim path = Request.FilePath
End Code

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

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

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

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

コレクション オブジェクト (配列とディクショナリ)

コレクションは、データベースからの Customer オブジェクトのコレクションなど、同じ型のオブジェクトのグループを指します。 ASP.NET には、Request.Files コレクションなどの多くの組み込みコレクションが含まれています。

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

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

配列では、StringIntegerDateTime など特定のデータ型を宣言します。 変数に配列を含められることを示すには、宣言の変数名にかっこ (Dim myVar() As String など) を追加します。 配列内の項目には、その位置 (インデックス) を使用するか、For Each ステートメントを使用してアクセスできます。 配列インデックスは 0 から始まります。つまり、最初の項目は位置 0、2 番目の項目は位置 1 などです。

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

配列内の項目の数は、その Length プロパティを取得することで決定できます。 配列内の特定の項目の位置を取得する (つまり、配列を検索する) には、Array.IndexOf メソッドを使用します。 配列 (Array.Reverse メソッド) の内容を逆にしたり、内容 (Array.Sort メソッド) を並べ替えたりすることもできます。

ブラウザーに表示される文字列配列コードの出力:

Razor-Img13

ディクショナリはキーと値のペアのコレクションであり、対応する値を設定または取得するためのキー (または名前) を指定します:

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

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

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

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

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

@myScores("test4")

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

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

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

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

Razor 構文で Visual Basic を使用する場合、メソッドにパラメーターを渡すには、"位置指定パラメーター" と "名前付きパラメーター" の 2 つのオプションがあります。 位置指定パラメーターを使用してメソッドを呼び出すには、メソッド宣言で指定された厳密な順序でパラメーターを渡します。 (通常、この順序は、メソッドのドキュメントを読むことによってわかります。)順序に従う必要があり、パラメーターをスキップすることはできません。必要に応じて、空の文字列 ("") を、または値を指定していない位置指定パラメーターの場合は null を渡します。

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

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

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

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

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

ご覧のように、パラメーターは別の順序で渡されます。 ただし、前の例とこの例を実行すると、返される値は同じです。

エラーの処理

Try-Catch ステートメント

多くの場合、コード内にステートメントがあり、制御できない理由で失敗する可能性があります。 次に例を示します。

  • コードでファイルを開く、作成、読み取り、書き込みしようとすると、あらゆる種類のエラーが発生する可能性があります。 必要なファイルが存在しない、ロックされている、コードにアクセス許可がない、などです。
  • 同様に、コードでデータベース内のレコードを更新しようとすると、アクセス許可の問題が発生したり、データベースへの接続が切断されたり、保存するデータが無効になる可能性があります。

プログラミングの観点からは、このような状況は例外と呼ばれます。 コードで例外が発生すると、ユーザーにとって迷惑なエラー メッセージが生成 (スロー) されます。

Razor-Img14

コードで例外が発生する可能性があり、この種類のエラー メッセージを回避するために、Try/Catch ステートメントを使用できます。 Try ステートメントでは、確認しているコードを実行します。 1 つ以上の Catch ステートメントで、発生した可能性がある特定のエラー (特定の種類の例外) を検索できます。 予想されるエラーを探すために必要な数の Catch ステートメントを含めることができます。

Note

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

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

コードで例外が処理されなかった場合は、前のスクリーン ショットのようなエラー ページが表示されます。 ただし、この Try/Catch セクションは、ユーザーにこのような種類のエラーが表示されないようにするのに役立ちます。

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

その他のリソース

リファレンス ドキュメント