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

Tom FitzMacken

この記事では、Razor 構文と Visual Basic を使用した ASP.NET Web ページによるプログラミングの概要について説明します。 ASP.NETは、Webサーバーで動的な Web ページを運用するためのマイクロソフトの技術です。

学習内容:

  • Razor構文を使ったASP.NET Webページのプログラミングをはじめるための上位8つのプログラミング Tips
  • 必要とする基本的なプログラミング概念
  • 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 コードを追加します。 この記事では、ASP.NET の Web ページを作成するための Visual Basic 言語と構文の使用方法の概要について説明します。

Note

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

8 つのプログラミング Tips

このセクションでは、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

Tip

HTML エンコード

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

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

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

2. コードブロックをコードで囲みます...終了コード

コードブロックには1つ以上のコードステートメントが含まれており、キーワード CodeEnd 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 プロパティがあり、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

Tip

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

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

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

単純なコード例

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

  1. エディターで、新しいファイルを作成し、「 Addnumbers. 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で囲まれています。
    • 変数 totalnum1num2、および 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 を使用した) 場合のプログラミング経験豊富な場合は、ここで読んだの多くが使い慣れたになります。 場合によっては、WebMatrix コードをvbhtmlファイルのマークアップに追加する方法についてのみ理解する必要があります。

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

サーバーコードブロックでは、多くの場合、テキストとマークアップをページに出力します。 サーバーコードブロックにコード以外のテキストが含まれていて、そのテキストをそのように表示する必要がある場合、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 タグ (<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など) を格納する整数変数、および日付値をさまざまな形式で格納する日付変数 (4/12/2012 や2009など) を指定できます。 他にもさまざまなデータ型を使用できます。

ただし、変数の型を指定する必要はありません。 ほとんどの場合、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 ページの開発を開始するには、いくつかのことを理解している必要があります。 次の表は、最も一般的な演算子をまとめたものです。

[オペレーター]

説明

使用例


+ - * /

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

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

.

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

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

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

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

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

Server.MapPath メソッドは、仮想パス (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 server code を使用すると、条件に基づいてタスクを実行し、特定の回数 (ループを実行するコード) でステートメントを繰り返すコードを記述することができます。

テスト条件

単純な条件をテストするには、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 (を含む) に達するまで続行されることを意味します。
  • ForNext ステートメントの間には、ブロックの内容があります。 これには、各ループで実行される1つ以上のコードステートメントを含めることができます。
  • Next i ステートメントは、ループを終了します。 カウンターをインクリメントし、ループの次の反復処理を開始します。

ForNext の行の間のコード行には、ループの各反復処理で実行されるコードが含まれています。 マークアップは、毎回新しい段落 (<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 キーワードの後に、コレクション内の単一の項目 (例では 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 オブジェクトのプロパティを使用して、次のような大量の情報を取得できます。

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

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

    @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つまたは複数のパラメーターもあります。 パラメーターは、メソッドがタスクを完了できるようにメソッドに渡す値です。 たとえば、Request.MapPath メソッドの宣言を見て、次の3つのパラメーターを取得します。

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

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

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

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

その他のリソース

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