AutoEventWireup

そろそろ、テキストエディタでaspxを編集してwwwrootに置く方法から、VisualStudioでWebサイト・Webアプリを起動・表示する方法に切り替える。
今回は、ASP.NET Webサイトをつくる。(ASP.NET Webアプリケーションとは別。)

ここまでフォルダを作っておく
ここまでフォルダを作っておく

ここまでフォルダを作っておく。

プロジェクトじゃなくてWebサイト
プロジェクトじゃなくてWebサイト

プロジェクトじゃなくてWebサイト。

ASP.NET Webサイトで、さきほどのフォルダパスを指定。
ASP.NET Webサイトで、さきほどのフォルダパスを指定。

ASP.NET Webサイトで、さきほどのフォルダパスを指定。

OKするとこうなる
OKするとこうなる

OKするとこうなる。

Default.aspx.csはこうなっているので、
Default.aspx.csはこうなっているので、

Default.aspx.csはこうなっているので、

こうしてみる。
ページがロードされた時にここに来るので、Debug.WriteLineで"Called Page_Load!"と出力。
ビルド(リビルド)すると、

こう出る。
こう出る。

こう出る。
コンパイルしてバイナリを作っているわけではなく、文法の確認程度っぽい。
これでデバッグすると、

Web.configが必要らしい
Web.configが必要らしい

Web.configが必要らしい。
デバッグじゃないとDebug.WriteLineが出なさそうなのでOKにする。

何も表示されないページが表示された
何も表示されないページが表示された

何も表示されないページが表示された。

一方で、"Called Page_Load!"はデバッグ出力されてた。
一方で、"Called Page_Load!"はデバッグ出力されてた。

一方で、"Called Page_Load!"はデバッグ出力されてた。
ちなみに、

追加されたWeb.Configは、
追加されたWeb.Configは、

追加されたWeb.Configは、

こんな感じ。
こんな感じ。

こんな感じ。
(これについては、追々・・・。)
さて、タイトルのAutoEventWireupだが、

@ Page | Microsoft Docs

ページのイベントを自動的にイベントハンドラに渡すかどうかを設定するものらしい。
なので、falseにすれば、Page_Loadは呼ばれない。

とすると、

出力されてないので、Page_Loadが呼ばれてないのがわかる。
出力されてないので、Page_Loadが呼ばれてないのがわかる。

出力されてないので、Page_Loadが呼ばれてないのがわかる。

Sample/aspnet/PageDirective/AutoEventWireup/src/PageDirective at master · bg1bgst333/Sample · GitHub

Inherits

Inherits属性は、継承するページの分離コードクラスを指定する。

@ Page | Microsoft Docs

名前空間も含めて指定できるので、同じファイル、同じクラス名、違う名前空間の場合に対応。
Inherits.csが、

の場合、
Inherits.aspxが、

<%@ Page Language="C#" CodeFile="Inherits.cs" Inherits="Inherits1.Inherits" %>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title id="title_index">Inherits</title>
  </head>
  <body>
    <% Response.Write(Method1()); %>
  </body>
</html>

なら、

こうなる
こうなる

こうなる。

なら、

こうなる
こうなる

こうなる。

Sample/aspnet/PageDirective/Inherits/src/PageDirective at master · bg1bgst333/Sample · GitHub

CodeFile

CodeFile属性は、ページが参照する分離コードファイルのパスを指定する。

@ Page | Microsoft Docs

これまで、".aspx"ファイルと、".cs"ファイルは同じフォルダ階層にあったが、違うフォルダにしてみる。

src1フォルダを作成
src1フォルダを作成

src1フォルダを作成。
CodeFile.aspxは、

<%@ Page Language="C#" CodeFile="src1/CodeFile.cs" Inherits="CodeFile" %>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title id="title_index">CodeFile</title>
  </head>
  <body>
    <% Response.Write(Method1()); %>
  </body>
</html>

CodeFile属性で、src1のCodeFile.csを参照している。

src1の下にCodeFile.csを置いて
src1の下にCodeFile.csを置いて

src1の下にCodeFile.csを置いて、

Method1で、"src1/CodeFile.Method1 Called!"を返す。

アクセスすると、こうなる。
アクセスすると、こうなる。

アクセスすると、こうなる。

今度はsrc2フォルダを作成
今度はsrc2フォルダを作成

今度はsrc2フォルダを作成。

今度はsrc2のCodeFile.cs
今度はsrc2のCodeFile.cs

今度はsrc2のCodeFile.cs。

"src2/CodeFile.Method1 Called!"を返す。
あとは、

CodeFile属性で、src2のCodeFile.csを指定すると、

&quot;src2/CodeFile.Method1 Called!&quot;になる
"src2/CodeFile.Method1 Called!"になる

"src2/CodeFile.Method1 Called!"になる。

Sample/aspnet/PageDirective/CodeFile/src/PageDirective at master · bg1bgst333/Sample · GitHub

Language

@PageディレクティブのLanguage属性は、埋め込みコードブロックなどのコードをコンパイルする言語を指定する。

@ Page | Microsoft Docs

これまでは、"C#"使ってたけど、"VB"でもコードを書ける。

"VB"でfor文を書いた。

&quot;VB&quot;でも実行できた。
"VB"でも実行できた。

"VB"でも実行できた。

Sample/aspnet/PageDirective/Language/src/PageDirective at master · bg1bgst333/Sample · GitHub

@Page

@Pageディレクティブでは、ページ(.aspx)のさまざまな設定を定義する。

@ Page | Microsoft Docs

Inherits属性とCodeFile属性について試してみる。

この2つのファイルを用意する
この2つのファイルを用意する

この2つのファイルを用意する。
PageDirective.aspx.csを、

public partial class PageDirective : System.Web.UI.Page
{
    public string Method1()
    {
        return "Method1 Called!";
    }
}

こうして、
PageDirective.aspxを、

<%@ Page Language="C#" Inherits="PageDirective" %>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title id="title_index">PageDirective</title>
  </head>
  <body>
    <% Response.Write(Method1()); %>
  </body>
</html>

Inheritsだけにする。
クラス名があれば、自分のファイル名 + ".cs"だからね。

Inheritsだけじゃダメか。
Inheritsだけじゃダメか。

Inheritsだけじゃダメか。
では、

<%@ Page Language="C#" CodeFile="PageDirective.aspx.cs" %>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title id="title_index">PageDirective</title>
  </head>
  <body>
    <% Response.Write(Method1()); %>
  </body>
</html>

CodeFileだけの場合どうだろ。

両方必要なのか
両方必要なのか

両方必要なのか。
最後に、
PageDirective.aspx.csなのに、

クラス名はPage1で、

PageDirective.aspxの側もInheritsはPage1にしている場合。

何の問題もない
何の問題もない

何の問題もない。
InheritsもCodeFileも存在していて正しく指定していればいいのか。
(考えてみれば、Javaと違って、C#はソース名とクラス名違ってもいいんだっけ。)

Sample/aspnet/PageDirective/PageDirective/src/PageDirective at master · bg1bgst333/Sample · GitHub

ディレクティブ式

"<%@~%>"は、ディレクティブ式で、ページ(.aspx)やユーザコントロール(.ascx)などの設定を指定する。

ASP.NET inline expressions - ASP.NET | Microsoft Docs
インライン式(<%=, <%@, <%#, <%$, <%--)の概要 - Qiita
ASP.NET ページのページはどこから派生しているか? - ASP.NET の仕組み - ASP.NET 入門
第4回 ASP.NETページのフレームワーク(前編)― コードビハインドとPageクラス ―:連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― (1/3 ページ) - @IT

まず、directive_expression.aspxで、

と書く。
先頭で"@ Page"ディレクティブが使われている。
ここにこのページの設定を書く。
表示部分はdirective_expression.aspxが担うが、処理の部分はdirective_expression.aspx.cs(CodeFileに指定)のdirective_expressionクラス(Inheritsに指定)が担う。
directive_expression.aspx.csは、

と書く。
このページは、System.Web.UI.Pageの派生クラスであり、Method1メソッドを定義しておく。
これで、directive_expression.aspxの中でMethod1を呼び出すことが出来る。

ページからMethod1を呼べている
ページからMethod1を呼べている

ページからMethod1を呼べている。

Sample/aspnet/inline_expressions/directive_expression/src/inline_expressions at master · bg1bgst333/Sample · GitHub

式の表示

"<%=~%>"の中に、変数や式を入れれば、その内容を表示してくれる。

ASP.NET inline expressions - ASP.NET | Microsoft Docs

displaying_expression.aspxで、

とすると、

1つ目は、整数値の加算だし、2つ目は文字列の連結。
1つ目は、整数値の加算だし、2つ目は文字列の連結。

1つ目は、整数値の加算だし、2つ目は文字列の連結。
どっちも結果が表示されてる。

Sample/aspnet/inline_expressions/displaying_expression/src/inline_expressions at master · bg1bgst333/Sample · GitHub