Visual Studio 2017 ASP.NET MVC コードファースト 初めてのモデルに機能追加


ASP.NETでMVCによるコードファーストでモデルを改造します。
前回、動くプロジェクトにビュー(画面)を追加しました。
なんとなくビューに表示できるだけしか作らなかったので、もう少しロジックっぽいものをプロジェクトに追加します。
内容はコードファーストの機能に特化したものではないのですが、前回の画面が参照系なのでしかたないです。コードファーストのプロジェクトに、DBとは関係ないモデルも使えるかな?というところから始まっていますので。
参考の2つの記事を見てないと、話しが伝わりません。一話完結でなくてすみません。
今回も、ASP.NETの機能的な動きから、試してみたいやり方で作ったサンプル用のビジネスロジックです。
これを見て何か作りたくなったらいいんです。

参考

MVCでコードファーストを作ったプロジェクトの記事
Visual Studio 2017 ASP.NET MVC コードファースト 初めてのプロジェクトの作成
MVCで画面を作った記事
Visual Studio 2017 ASP.NET MVC コードファースト 初めての画面の作成

環境

Windows 10 Home 64bit
Visual Studio 2017 Community C#
.NET 4.6.1
EntityFramework 6.2.0

今回作るもの

前回のコントローラの処理をモデルに移動させる。
モデルに新機能を追加する。

ビューにもコントローラにもロジックは入れられるのですが、理想はともかく、同一プロジェクト内では統一した作りのほうがやはり見やすいと思いますね。
見やすさは障害の予防にも、発覚後の調査にも役立ちます。

ビジネスロジックを追加するモデルは前回の画面作成で作った、DBに保存しないモデルを使います。

作成手順

コントローラの処理の引っ越し


修正前のコントローラです。

修正前のモデルです。

修正後のコントローラです。

BooksController.cs
        public ActionResult Disp()
        {
            ToteBag bag = new ToteBag();

            bag.MakeDispData(db);

            return View(bag);
        }

1行になりました。


修正後のモデルです。

ToteBag.cs
    public class ToteBag
    {
        public string DispData { get; set; }

        public void MakeDispData(BookModel db)
        {
            var aa = from dd in db.Books
                     orderby dd.Id descending
                     select dd;

            DispData = "ToteBag:";
            DispData += "<br />";
            foreach (var dd in aa)
            {
                DispData += dd.Id;
                DispData += "<br />";
                DispData += dd.Name;
                DispData += "<br />";
                DispData += dd.Memo;
                DispData += "<br />";
                DispData += dd.Memo2;
            }

        }
    }

MakeDispDataを追加して、コントローラから呼び出すように変更しました。
MakeDispDataを実行することによって、モデルのデータが完成したというイメージです。

動きの確認


開始ページを指定していないのでDisp.cshtmlを開いて実行してください。
前回と同じ結果になりました。引っ越し完了です。

新機能の追加

モデルの作成機能はできたので、ビューから呼ばれる機能を作ります。
前回の画面作成時に使った@Html.Rawが気になって、@Html.Rawを使うシチュエーションで検討します。
必要な機能ではなくて作りたい機能になってしまいました。

ToteBag.cs
    public class ToteBag
    {
        public string DispData { get; set; }

        public void MakeDispData(BookModel db)
        {
            var aa = from dd in db.Books
                     orderby dd.Id descending
                     select dd;

            DispData = "ToteBag:";
            DispData += "<br />";
            foreach (var dd in aa)
            {
                DispData += dd.Id;
                DispData += "<br />";
                DispData += dd.Name;
                DispData += "<br />";
                DispData += dd.Memo;
                DispData += "<br />";
                DispData += dd.Memo2;
            }

        }

        public string MakeLinkAndLF(string htmlData)
        {
            string wkData = "";

            string RegexPattern = "";

            wkData = htmlData;

            //全角の前まで取得。Google先生用に";","_","+"を追加。
            RegexPattern = @"http(s)?://([\w-]+\.)+[\w-]+(/[a-zA-Z0-9-./?%&=;_+]*)?";
            wkData = Regex.Replace(wkData, RegexPattern, "<a href=\"$0\">$0</a>");

            RegexPattern = @"\r\n";
            wkData = Regex.Replace(wkData, RegexPattern, "<br />\r\n");

            return wkData;
        }
    }

MakeLinkAndLFを追加して、ビューから呼び出すように変更しました。
MakeLinkAndLFを実行することによって、ビューの表示においてリンクと改行をサポートします。

一般的なURLの正規表現判定パターンを少しいじっています。
全角がきたら終わりとみなすようにした。
Google先生の検索結果には";","_","+"が含まれるので、許すようにした。


MakeLinkAndLFを呼び出しますが、DisplayForの結果を渡すことにしました。DisplayForによってサニタイジングされた文字列を取得できています。
やはり、Rawだけで画面に単純にそのまま表示するのは危険です。

サンプルを短くするために正規表現を使いましたが、短い割には疲れました。

動きの確認


テスト用データです。Google先生の検索結果のURLでも使ってください。


下側がMakeLinkAndLFで表示したものです。
入力画面と同じように改行され、リンクが生成されています。
動いたのなら、ソース表示して確認してみてください。

ビジネスロジックを作ってみて

機能はショボいですが、モデルとコントローラとビューを作ってきました。その上にロジックを組み込んでみました。
MVCしてるって言えるのかなぁ。
今回、サンプルで作ったMakeLinkAndLFは伝言板なんかで吹出しの中に表示するような感じのイメージです。伝言板を作るのだったら、後どれぐらい調べたらできるのでしょう。
とりあえず、いろいろ作ってみてください。