ASP.NET MVC では ViewBag、ViewData ではなく、ViewModel を利用しましょう

こんにちは！

本記事では、ASP.NET MVC における ViewModel  の採用のメリットについて解説します。


## ViewBag、ViewData ではなく、ViewModel の採用をお勧めします


ASP.NET MVC には、コントローラーからビューにデータを引き渡す手段として ViewData、ViewBag や TempData があり、それらを解説した以下記事は 2021 年現在も多くの方に閲覧頂いています。

https://blogs.jp.infragistics.com/entry/2016/02/26/093000

なのですが、ViewData、ViewBag や TempData は手軽な機能ではありますが、<u>採用をお勧めしません。</u>

ViewModel の採用を強くお勧めします。特に大規模プロジェクトなら尚更です。

それらの理由や、メリットについて解説します。


## ViewModel を採用するメリット

### コントローラーからビューへモデルクラスを連携できる

ViewModel の名の通り、モデルクラスを設定することが出来ます。

モデルクラスを設定することによって、インテリセンスの有効化など、後ほど紹介する様々な恩恵を受けることが出来ます。

```cs

namespace SampleMVC.Models
{
    public class User
    {
        public string Name { get; set; }
    }
}
```

```html
@model SampleMVC.Models.User

<h2>
    @Model.Name
</h2>
```



### インテリセンスの有効化による生産性の向上

モデルクラスは、静的オブジェクトなので構造体を Visual Studio が解析し、インテリセンスが有効になります。

ViewData、ViewBag では、インテリセンスを有効に活用することはできません。

インテリセンス の有効化は、生産性の向上に強く貢献してくれるでしょう。

![gif1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/354b46a2-b737-e36f-4de1-145cfa5c2cf3.gif)


### 誤ったプロパティの設定を防ぐ

ViewModel は、誤ったプロパティを指定するとビルドエラーとなります。

<b>ViewModel の場合</b>

![gif3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/46abffd2-0885-86f3-53a5-384921941512.gif)

ViewBag、ViewData は以下のスクリーンショットのようにダイナミックで動作するため、誤ったプロパティを設定したとしても、そのソースコードが実行されるまでエラーだとしても分かりません。

<b>ViewBag の場合</b>

![gif2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48623/44d83200-1a57-291c-fb1d-b8fce62be29c.gif)



また、もしプロパティ名が変更となった場合に、影響範囲を調べることが非常に困難となります。

ViewModel だと モデルクラスによる静的オブジェクトのため、プロパティ名が変更された場合、Visual Studio による一括置換であったり、ビルド時にエラーとなり、すぐに気づく事が出来ます。



### 属性機能が利用できる、例えばバリデータの実装が簡単に行える

ViewModel では、モデルクラスに属性機能が付与できる事も大きなメリットです。

属性は、バリデータの設定 (必須、文字の長さ等の入力検証設定) や、マッピング機能 (データベースやJSONオブジェクト) を強力に支援してくれる機能ですね。

例えば、必須チェックは下記のように属性を付与するだけで実装することが出来ます。

```cs
    public class User
    {
        [Required(ErrorMessage = "姓は必須です")]
        public string Name { get; set; }
    }
```

## まとめ

ASP.NET MVC にておいて、ViewModel を採用すべきメリットについて解説しました。

ViewBag や ViewData にも、ダイナミックで出来ることが特徴ですが、土台となる .NET テクノロジーが、静的オブジェクトで構築されるため相性が良くはありません。

是非とも ASP.NET MVC のアプリケーションにおける コントローラ、ビューの連携は ViewModel の採用をお勧めします。

## Ignite UI for ASP.NET MVC

[Ignite UI for ASP.NET MVC](https://jp.infragistics.com/products/ignite-ui-aspnet-mvc) は、データグリッドやチャートなど100種類以上のUIコントロールを収録した完全版UIライブラリです。ダイナミックでレスポンシブルなWebアプリケーション開発作業の効率化を支援します。.NET 5に対応。

Ignite UI for ASP.NET MVC はトライアル版での試用が可能です。トライアル版を利用するためには [こちら](https://jp.infragistics.com/products/ignite-ui-aspnet-mvc/download)のページ より申し込みください。

また、製品をご購入をご検討のお客様は こちらのページ よりお気軽にお問い合わせください。


## 開発全般に関するご相談はお任せください！

インフラジスティックス・ジャパンでは、各開発プラットフォームの技術トレーニング、コンサルテーションの提供、開発全般のご支援を行っています。


https://jp.infragistics.com/service-and-support/professional-service



「古い技術やサポート終了のプラットフォームから脱却する必要があるが、その移行先のプラットフォームやフレームワークの検討が進まない、知見がない。」

「新しい開発テクノロジーを採用したいが、自社内にエキスパートがいない。日本語リソースも少ないし、開発を進められるか不安。」

「自社のメンバーで開発を進めたいが、これまで開発フェーズを外部ベンダーに頼ってきたため、ツールや技術に対する理解が乏しい。」

「UIを刷新したい。UIデザインやUI/UXに関する検討の進め方が分からない。外部のデザイン会社に頼むと、開発が難しくなるのではないか、危惧している。」

といったご相談を承っています。

お問い合せは<a href="https://jp.infragistics.com/about-us/contact-us#contactform" target="_blank">こちら</a>からお気軽にご相談ください。