はじめてのASP.NET Core

ASP.NET Coreを触り始めているのですが、ASP.NET MVCの知識がなく、Web Formsの知識だけではチュートリアル見ても理解できなくて、なかなか捗りませんでしたが、だんだんと整理できてきたので投稿します。

参考リンク
- [Getting started with ASP.NET Core MVC and Visual Studio - ASP.NET Core Documentation](https://docs.asp.net/en/latest/tutorials/first-mvc-app/start-mvc.html)

# プロジェクトの作成

ファイル - 新規作成 - プロジェクト - ASP.NET Core Web Application (.NET Core)
を選択します。ここでのポイントは、似てるテンプレートがあるので、間違えないことですね。

|||テンプレート名|
|:-:|:-:|:--|
|1|×|ASP.NET Web Application (.NET Framework)|
|2|◯|ASP.NET Core Web Application (.NET Core)|
|3|×|ASP.NET Core Web Application (.NET Framework)|

1番目は、旧来のASP.NETで、2, 3番目がASP.NET Core。
.NET Coreベースと.NET Frameworkベースに分かれてますが、この記事では、.NET Coreベースの方で進めていきます。

次に以下のウィンドウが表示されます。

![スクリーンショット 2016-09-23 18.51.36.jpg](https://qiita-image-store.s3.amazonaws.com/0/4633/ea2eb99e-6311-9ffb-a23c-aebf9b50c64c.jpeg)

デフォルトで、[認証なし]なので、[認証の変更]ボタンを押して、[個別のユーザーアカウント]に変更します。[認証なし]のままプロジェクトを作成すると、スキャフォールディングが使用できません。

![スクリーンショット 2016-09-23 18.53.17.jpg](https://qiita-image-store.s3.amazonaws.com/0/4633/725f7eb3-afb7-9437-9a8b-2de3b0e5fcf3.jpeg)

ここで、[認証なし]を選択した場合でも、`project.json`に以下の記述を追加することで、スキャフォールディングが使用できます。

`dependencies`セクションに以下を追加する。

```json:project.json
"Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
  "version": "1.0.0-preview2-final",
  "type": "build"
},
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
  "version": "1.0.0-preview2-final",
  "type": "build"
}
```

`Tools`セクションに以下を追加する。

```json:project.json
"Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
  "version": "1.0.0-preview2-final",
  "imports": [
    "portable-net45+win8"
  ]
}
```

これで、プロジェクトの準備ができました。
このまま実行するだけで、テンプレートのページが表示されます。

# Controller

まずは、コントローラーを作ってみます。
`Controllers`フォルダ内に以下のようなファイルを作成します。
ちなみに、ファイル名の末尾は`Controller.cs`でなければなりません。

```csharp:HelloWorldController.cs
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;

namespace MvcMovie.Controllers
{
    public class HelloWorldController : Controller
    {
        // 
        // GET: /HelloWorld/

        public string Index()
        {
            return "This is my default action...";
        }

        // 
        // GET: /HelloWorld/Welcome/ 

        public string Welcome()
        {
            return "This is the Welcome action method...";
        }
    }
}
```

これで実行して、`http://localhost:xxxx/HelloWorld`にアクセスすると、`This is my defalut action...`と表示されたページが表示できます。

URLは、コントローラークラスのクラス名から`Controller`を削除したものが使われます。
デフォルトでは、そのクラス内の`Index`メソッドが実行されますが、`http://localhost:xxxx/HelloWorld/Welcome`とすることで、`Welcome`メソッドが実行され`This is the Welcome action method...`と表示されます。

URLのルーティングロジックは以下のとおりです。

`/[Controller]/[ActionName]/[Parameters]`

また、`Startup.cs`の`Configure`メソッドの以下の部分を変更すれば、初期表示のページを切り替えることができます。

```csharp:Starup.cs
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});
```

なお、`Starup`クラスは、`Program`クラスの`Main`メソッドから呼ばれます。

ASP.NET Coreの起動順序はこんな感じです。

1. Program.Main
2. Startup.ctor
3. Startup.ConfigureServices
4. Startup.Configure

詳しくは、[Understanding ASP.NET Core Initialization - Telerik Developer Network](http://developer.telerik.com/featured/understanding-asp-net-core-initialization/)が参照してください。

# View

次に、ビューを作ります。
先ほどのコントローラーの`Index`メソッドを以下に変更します。

```csharp:HelloWorldController.cs
public IActionResult Index()
{
    return View();
}
```

次に、Viewsフォルダ内にコントローラと同名（xxxControllerのxxx部分）のフォルダを作成します。
そして、そのフォルダの中に、`MVCビューページ`を追加します。

これで、もう一度、`http://localhost:xxxx/HelloWorld/`にアクセスすると、作成したビューが表示されるようになります。

なお、メニューなどの複数ページ共通部分は、デフォルトでは、`Views/Shared/_Layout.cshtml`で定義されています。
このファイル内の、`@RenderBody()`がプレースホルダーになっており、各ページはこの部分に表示されます。

# Model

ASP.NET Coreでは、`Entity Framework Core(EF Core)`を使用します。EF Coreでは、コードを先に書いて、そのコードからデータベースのテーブルを作成します。これをコードファーストと呼びます。

## DbContext

ASP.NET MVCでは、`DbContext`クラスを継承したクラスを作成していましたが、ASP.NET Coreのテンプレートには、`ApplicationDbContext`というクラスがある（`Data`フォルダにある）ので作成不要です。むしろ、作成してしまうと、DbContextが複数あって競合してしまうようです。

## Scaffolding

ASP.NET Coreのスキャフォールディングのダイアログで選択する`データコンテキストクラス`は、`ApplicationDbContext`を選択します。

ASP.NET MVCでは、これで完了でしたが、ASP.NET Coreでは、スキャフォールディング完了後、コマンドプロンプトで、以下のコマンドを実行してデータベースの初期化を行う必要があります。

```
dotnet ef migrations add Initial
dotnet ef database update
```

以上、かなり端折った部分もありますが、自分がASP.NET Coreを触ってハマったところは網羅できました。ASP.NET MVCのチュートリアルが理解できて、この記事を見ればASP.NET Coreも動かせるようになると思います。