> For the complete documentation index, see [llms.txt](https://kurohasu.gitbook.io/fsharpabout/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kurohasu.gitbook.io/fsharpabout/aspnet-mvc/aspnet-mvcnitsuite.md).

# ASPNET MVCについて

### MVCについて

MVCはUIを持つソフトウェアのアーキテクチャの一つで\
データ操作を扱う「Model」\
ユーザーに見せる画面の「View」\
それら2つをコントロールする「Controller」\
から構成されています。

```
*プロジェクトディレクトリ
│(ディレクトリ)
├ wwwroot
├ Properties
├ Views
├ Models
├ Controllers
│(ここから下はファイル)
├ appsettings.json
├ Program.fs
└ (Dockerfile)
```

ここからはデフォルト状態のディレクトリやファイルが何をしているのか見ていきましょう

#### wwwroot

ページ内のcss,jsやライブラリ(jqueryなど)を宣言する場所です。\
デフォルトの`js/site.js` は`Layout.cshtml`の最後の方で使用されています。

{% hint style="info" %}
デザインは[bootstrap](https://getbootstrap.com/)で定義されているため不要ですが、tailwindow CSSやFLOCSSに変更する場合は`css`ディレクトリ内で管理する必要があります
{% endhint %}

#### Views

ビューに関するディレクトリです。\
この中に更にコントローラ名と同じディレクトリを作り、アクセスメソッドと同じ名前のcshtmlファイルを作り…といった感じでユーザに見せる画面を記述します。

{% tabs %}
{% tab title="Home/" %}
Index.cshtmlではアクセス時(`/Home`,もしくはルート)のページ\
Privacy.cshtmlでは`/Home/Privacy`にアクセスしたときのページ\
が記載されています
{% endtab %}

{% tab title="Shared/" %}
`_Layout.cshtml`のように他のページでも使いまわす共通のcshtmlの置き場所です。\
cshtml内で特に指定が無い場合、同じディレクトリにある`_ViewStart.cshtml`が読み出され、ファイル内の宣言がある通り`_Layout.cshtml` が呼びされます。
{% endtab %}

{% tab title="\_ViewImports.cshtml" %}
Viewに読み込まれるcshtmlファイルです(多多分)
{% endtab %}

{% tab title="\_ViewStart.cshtml" %}
Viewの生成時に読み込まれるcshtmlファイルです。デフォルトでは以下のようにレイアウトとして`Views/Shared/_Layout.cshtml`を呼び出すように設定されています

```cshtml
@{
    Layout = "_Layout";
}
```

{% endtab %}
{% endtabs %}

#### Models

レコードを使ったデータ型定義や、モジュール宣言を用いたロジック定義など、データに関する操作を定義したファイルをまとめるディレクトリです。\
デフォルトの`ErrorViewModel.cshtml`は`RequestId`というstring型を宣言しています

#### Controllers

アクセスパスに応じてビューの表示やモデルへの入出力を制御するコントローラーをまとめるディレクトリです。\
`Index`,`Privacy`にアクセスした場合は、同じ名前のcshtmlに表示し、\
`Error`にアクセスした場合は引数`reqId`を渡してcshtmlを表示します<br>

#### appsettings.json

ASP.NETアプリケーションに関する設定のためのjsonファイルです <br>

* `Logging:LogLevel:Default`\
  → ログのデフォルトレベル（例: `Trace`, `Debug`, `Information`, `Warning`, `Error`, `Critical`, `None`）
* `Logging:LogLevel:Microsoft.AspNetCore`\
  →名前空間/カテゴリ単位でのログレベル上書き。Microsoft.AspNetCore に対するログの出力レベルを制御します。
* `AllowedHosts`\
  → ホスト名のホワイトリスト（Host header のチェックに使う）\
  開発中は "\*"（全許可）で問題ありませんが本番では明示的に `example.com`,`api.example.com`のように指定することが推奨されます。

#### Program.fs

ASP.NET全体に関するプログラムを記述するファイルです。\
デフォルトではエラー発生時に/home/Errorが読み込まれるようになっています。\
また`app.MapControllerRoute()` を使ってコントローラーまでのルートやパスの指定を行うことでアクセス可能になります。

```fsharp
//MapControllerRouteの使い方(name,patternは必須)
app.MapControllerRoute(
    name = ルート名,                    //"HomePage"→localhost/HomePageにアクセス時に呼び出し
    pattern = URLのパターン,            //"{controller=Home}/{action=Index}/{id?}"→Home/1にIndexコントローラーでアクセス
    *defaults = デフォルトのパラメータ    //上のパターンが不足している場合に渡される
    *constraints = パラメータの制約      //"{id:int}"→idがint型かチェック
    *dataTokens = 追加のメタデータ       //Viewに追加のメタデータを付与
)
```

{% hint style="info" %}
`defaults`,`constraints`,`dataTokens`は全てRouteValueDictionary型で渡す必要があります\
(更にそれはdict型である必要があるので`dict|>RouteValueDictionary`である必要があります…)
{% endhint %}
