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

Tom FitzMacken

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

学習内容:

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

ソフトウェア バージョン

  • 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 のバージョンで使用できます。 Visual Basic テンプレートは、NuGet パッケージとしてインストールできます。 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... で囲みます。終了コード

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

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

文字列、数値、日付など、変数に値を格納できます。キーワード (keyword)を使用して新しい変数を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 言語では大文字と小文字は区別されません。 プログラミング キーワード (、、IfTrueなどDim) と変数名 (、または subTotalなどmyString) は、いずれの場合でも記述できます。

次のコード行では、小文字の名前を使用して変数 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 プロパティ、customer オブジェクトには プロパティがあります 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囲まれています。
    • 変数 total、、 num1num2および totalMessage には、複数の数値と文字列が格納されます。
    • 変数に 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 マークアップにサーバー コードを追加する方法の基本的な例を確認しました。 ここでは、Visual Basic を使用して、Razor 構文 (プログラミング言語ルール) を使用 ASP.NET サーバー コードを記述する基本について説明します。

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

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

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

  • <em></em>のような <p></p> 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 タグ (<br />) と、サーバー コードと一致する HTML タグが含まれています。 ここでも、各行の前に 演算子を @: 個別に付けることもできます。どちらの方法でも動作します。

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

    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 変数内のデータがどのように使用されているかに基づいて型を把握できます。 (場合によっては型を指定する必要があります。これが true の例が表示されます)。

型を指定せずに変数を宣言するには、 を使用し、変数名 (例: Dim myVar) を使用Dimします。 型を使用して変数を宣言するには、 に変数名を加え、その後Asに 型名 (例: Dim myVar As String) を指定Dimします。

@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

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

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

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

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

方法

説明


AsInt(), IsInt()

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

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

AsBool(), IsBool()

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

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

AsFloat(), IsFloat()

"1.3" や "7.439" などの 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 示すキーワード (keyword)または文字です。 Visual Basic では多くの演算子がサポートされていますが、Web ページの開発を開始するには、少数 ASP.NET 認識する必要があります。 次の表は、最も一般的な演算子をまとめたものです。

[オペレーター]

説明

使用例


+ - * /

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

@(5 + 13)

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

=

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

Dim age = 17

Dim income = Request("AnnualIncome")

<>

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

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

< > <= >=

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

If 2 < 3 Then
    ' Do something.
End If

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

&

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

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

+= -=

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

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

.

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

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

()

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

@(3 + 7)

@Request.MapPath(Request.FilePath)

Not

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.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 サーバー上でテキスト ファイルまたはイメージ ファイルを読み書きする場合です。

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

@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

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

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

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

@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

ループは、キーワード (keyword)で始まり、その後に For 3 つの要素が続きます。

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

Next 行の間のForコード行には、ループの反復ごとに実行されるコードが含まれています。 マークアップは、毎回新しい段落 (<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 キーワード (keyword)の後に、コレクション内の 1 つの項目 (例では ) を表す変数が続き、myItemその後にキーワード (keyword)が続Inき、ループするコレクションが続きます。 ループの For Each 本体では、前に宣言した変数を使用して現在の項目にアクセスできます。

Razor-Img12

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

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

このループは、キーワード (keyword)で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 から始まります。つまり、1 番目の項目は 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.ReverseArray.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>

ディクショナリを作成するには、キーワード (keyword)をNew使用して、新しいDictionaryオブジェクトを作成していることを示します。 キーワード (keyword)を使用して、変数にディクショナリを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 つのパラメーターは、 virtualPathbaseVirtualDir、および allowCrossAppMappingです。 (宣言では、パラメーターが受け入れられるデータのデータ型と共に一覧表示されていることに注意してください)。このメソッドを呼び出すときは、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

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

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

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

その他のリソース

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