0から始めるASP.NET Core その１

# はじめに

ASP.NETの WebForm は経験があるけども、そろそろ卒業してASP.NET MVC やASP.NET Core に移ろうと思い、書籍やサイトにて情報を集めていますが、どこへ行っても応用ばかりで基本的な部分が紹介されているところというのが少ない。そして、書籍やサイトを参考にサンプルを書いてみても、基礎がわからないのでやりたいことを実現しようとしても実現できない。
そして、そのような情報を探そうとしても、グーグルの検索が難しくなっていて、なかなかヒットしない（探そうとしているキーワードを考えるのも難しい）。

ならば、自ら、１つ１つ解析しながら進むしかない！環境もあるんだし。ということで、１つ１つ確認しながら進むことにしてみました。１から無知な状態で始めると、いろいろ課題や問題点も出てくるので、それを一つ一つ片付けながらやっていこうと思います。

# もくじ

* 0から始めるASP.NET Core その1:ASP.NET Core 2.1 のRazor Pages で始めるよ!
* [0から始めるASP.NET Core その2:Main関数の中身](https://qiita.com/toryuneko/items/98a11421411a01e5d451)

## ASP.NET Core 2.1を利用するよ

2018年10月時点最新の、.NET Core 2.1 を利用します。
なお、開発環境はとりあえずVisual Studio 2017 Community(15.8.8)で行います。
進むにつれ、バージョンはアップしていくかもしれません。

## プロジェクトの作成！

0から始めるため、「ASP.NET Core Web アプリケーション」より「空」のプロジェクトで行います。なお、SSLとDockerは今回設定するとややこしいことと、目的が異なるので外しておきます。

## 最初は Razor Pages から

空のプロジェクトで作ると

```C#
		public void Configure(IApplicationBuilder app, IHostingEnvironment env)
		{
			if (env.IsDevelopment())
			{
				app.UseDeveloperExceptionPage();
			}

			app.Run(async (context) =>
			{
				await context.Response.WriteAsync("Hello World!");
			});
		}
```

だけのコードができます。実行すると、Hello World! が表示されるというのはわかったのと、context 自身は、ASP.NET のWebFormでも出てきたので、パス。Razor のページでの書きこができるよう、MVCを有効にします。

```C#
public void ConfigureServices(IServiceCollection services)
{
	services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
	if (env.IsDevelopment())
	{
		app.UseDeveloperExceptionPage();
	}
    app.UseMvc();
}
```

これで実行すると、当然404エラーが返ってきます。

次に、ソリューションのルート階層に「Pages」フォルダーを作り、そこにメニューから「追加＞Razorページ」が選択できるので、そこから追加します。

「Razorページ名」を、とりあえず「Index」で作成、「PageModelクラスの生成」のみチェックをつけ、それ以外のチェックは外し、追加を押します。

「Pages」フォルダに以下のファイルが出来上がります

* Index.cshtml
* Index.cshtml.cs

Index.cshtmlファイルは、

```c#
@page
@model aspnet_zero.Pages.IndexModel
@{
    Layout = null;
}

以下、HTML
```

というのができています。

Index.cshtml.cs には

```cs
    public class IndexModel : PageModel
    {
        public void OnGet()
        {

        }
    }
```

ができています。
とりあえず、最初は cshtml.cs は無視して、cshtml で遊びます。

## サーバーサイドで出力させる

Razor の書き方などはここでは説明しませんので、Microsoftのサイトや書籍などで確認して欲しいです。とりあえず、@ { ... } の中にコードが書けるということが分かったので、情報を表示させてみます。

```html
@{
    Layout = null;
    string hello = "はろーわーるど";
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <p>@hello</p>
</body>
</html>
```

「デバッグ＞デバッグの実行」より起動させると、無事に

```
はろーわーるど
```

の文字が!!やったね!!!...ってちょっとまって。
出力されたHTMLコードを見てみると、

```html

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <p>&#x306F;&#x308D;&#x30FC;&#x308F;&#x30FC;&#x308B;&#x3069;</p>
</body>
</html>
```

出力文字列がHTMLエンティティに変換されて出力されているのですが、これは...[^1]
もしかして、はろーわーるどが悪いんだろうと思い、もう一つサンプルを。

```html
@page
@model aspnet_zero.Pages.IndexModel
@{
    Layout = null;
    var pref = new[]
    {
        "北海道",
        "青森",
        "秋田",
        "岩手",
        "山形",
        "宮城",
        "福島",
        "栃木",
        "群馬",
        "茨城",
        "埼玉",
        "東京",
        "千葉",
        "神奈川",
        "新潟",
        "富山",
        "石川",
        "福井",
        "長野",
        "山梨",
        "静岡",
        "岐阜",
        "愛知",
        "三重",
        "滋賀",
        "奈良",
        "京都",
        "和歌山",
        "大阪",
        "兵庫",
        "鳥取",
        "岡山",
        "島根",
        "広島",
        "山口",
        "香川",
        "徳島",
        "愛媛",
        "高知",
        "福岡",
        "大分",
        "佐賀",
        "熊本",
        "宮崎",
        "鹿児島",
        "沖縄"

    };
}

<!DOCTYPE html>

<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <ul>
        @foreach( var s in pref)
        {
            <li>@s</li>
        }
    </ul>
</body>
</html>
```

結果、

```html
<!DOCTYPE html>

<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <ul>
            <li>&#x5317;&#x6D77;&#x9053;</li>
            <li>&#x9752;&#x68EE;</li>
            <li>&#x79CB;&#x7530;</li>
            <li>&#x5CA9;&#x624B;</li>
            <li>&#x5C71;&#x5F62;</li>
            <li>&#x5BAE;&#x57CE;</li>
            <li>&#x798F;&#x5CF6;</li>
            <li>&#x6803;&#x6728;</li>
            <li>&#x7FA4;&#x99AC;</li>
            <li>&#x8328;&#x57CE;</li>
            <li>&#x57FC;&#x7389;</li>
            <li>&#x6771;&#x4EAC;</li>
            <li>&#x5343;&#x8449;</li>
            <li>&#x795E;&#x5948;&#x5DDD;</li>
            <li>&#x65B0;&#x6F5F;</li>
            <li>&#x5BCC;&#x5C71;</li>
            <li>&#x77F3;&#x5DDD;</li>
            <li>&#x798F;&#x4E95;</li>
            <li>&#x9577;&#x91CE;</li>
            <li>&#x5C71;&#x68A8;</li>
            <li>&#x9759;&#x5CA1;</li>
            <li>&#x5C90;&#x961C;</li>
            <li>&#x611B;&#x77E5;</li>
            <li>&#x4E09;&#x91CD;</li>
            <li>&#x6ECB;&#x8CC0;</li>
            <li>&#x5948;&#x826F;</li>
            <li>&#x4EAC;&#x90FD;</li>
            <li>&#x548C;&#x6B4C;&#x5C71;</li>
            <li>&#x5927;&#x962A;</li>
            <li>&#x5175;&#x5EAB;</li>
            <li>&#x9CE5;&#x53D6;</li>
            <li>&#x5CA1;&#x5C71;</li>
            <li>&#x5CF6;&#x6839;</li>
            <li>&#x5E83;&#x5CF6;</li>
            <li>&#x5C71;&#x53E3;</li>
            <li>&#x9999;&#x5DDD;</li>
            <li>&#x5FB3;&#x5CF6;</li>
            <li>&#x611B;&#x5A9B;</li>
            <li>&#x9AD8;&#x77E5;</li>
            <li>&#x798F;&#x5CA1;</li>
            <li>&#x5927;&#x5206;</li>
            <li>&#x4F50;&#x8CC0;</li>
            <li>&#x718A;&#x672C;</li>
            <li>&#x5BAE;&#x5D0E;</li>
            <li>&#x9E7F;&#x5150;&#x5CF6;</li>
            <li>&#x6C96;&#x7E04;</li>
    </ul>
</body>
</html>

```

うん、何か気持ち悪いので、これを直す方法を次回までに、この問題の対処する方法を調査する...ということで、続きます

[^1]: Firefox 63 での確認結果です

## 追記

上記、HTMLエンティティ問題は、別途記事にて回答いただき、解決しました。

```C#
public void ConfigureServices(IServiceCollection services)
{
	services.Configure<WebEncoderOptions>(options => {
		options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All);
	});

	services.AddMvc();
}
```

上記コードでHTMLエンティティ問題を解決できることを確認しています。