伝説のどいつまの伝説~失敗編~

岩美に永住したい新米エンジニアのあれやこれやな話。

【C#】ASP.NET Core MVCを使ってみよう。-After②-

前回の内容はこちら↓
d01tsumath.hatenablog.com

RSSフィードを取ってくるところまで修正しました。
今回は前回のAfterコードでいきなり現れたArticleクラスの実装と、View側の実装をやっていきたいと思います。
Before/Afterのみ見たいという方は、以下のGithubにてコード公開していますので、そちら参照ください。
github.com


まずはArticleクラスの実装から。

Before

public class Title
{
    public string Name { get; set; }
    public string URL { get; set; }
}


After

public class Article
{
    public string Title { get; }
    public string Url { get; }

    public Article(string title, string url)
    {
        this.Title = title;
        this.Url = url;
    }
}

Articleクラス実装
変数はName->TitleURL->Urlに変更しました。
大きく違うのは、コンストラクタでのみ値をセットしている点です。
最初に値をセットした後に変更する予定がない場合は、不用意に値が変更されることを防ぐためにこのようにします。


IndexViewModelsを実装

using System;
using System.Collections.Generic;
using D01tsumaTask3.Models;

namespace D01tsumaTask3.ViewModels.Home
{
    public class IndexViewModel
    {
        public IEnumerable<Article> Articles { get; }

        public IndexViewModel(IEnumerable<Article> articles)
            => this.Articles = articles ?? throw new ArgumentNullException(nameof(articles));
    }
} 

ViewModelはViewで使用されるデータモデルを表すクラスです。
今回は Index.cshtml用のデータモデルクラスを作成しました。
やっていることとしては、 HomeController.cstitleList を作ることとほぼ同義です。
⑦と同様、最初に値をセットした後に変更することはないので、同じくコンストラクタでのみ値をセットします。 そして、IEnumerable<T> を用いているというのがとても重要で、以下参照。


次に、Index.cshtmlの修正をします。

Before

@{
    ViewData["Title"] = "Index";
}

<h2>どいつまブログRSS5件抽出</h2>

@{
    foreach (var title in (List<Title>)ViewData["titles"])
    {
        <div><a href="@title.URL" target="_blank">@title.Name</a></div>
    }
} 


After

@using D01tsumaTask3.ViewModels.Home
@model IndexViewModel

@{
    ViewData["Title"] = "Index";
}

<h2>どいつまブログRSS5件抽出</h2>

@{
    foreach (var x in this.Model.Articles)
    {
        <div>
            <a href="@x.Url" target="_blank">@x.Title</a>
        </div>
    }
} 


@using 宣言
@using名前空間をインポートできます。
Viewファイル内でモデルクラスを使用することを表すために、@Model を使用して先程作成した IndexViewModel を参照します。


(List<Title>)ViewData["titles"] から this.Model.Articles へ変更
foreachIEnumerable インターフェースを介して要素へのアクセスできます。
今回は全て自分が作ったのでList<Title> で型変換かけているが、チーム開発をするという観点からするとキケン。
Index.cshtml はAさんが作ってて IndexViewModel.cs はBさんが作ってるのような状況で、コミュニケーションロスが発生すると
ViewData は場合によっては配列でこないかもしれない…ことが起こりうるわけです。
場合によっては、型を縛りすぎない実装も必要だと学びました。


転職して1ヶ月半経ちました。
実務もぼちぼち入ってきて、わからないながらもC#の深みに少しずつ片足突っ込みつつあります、多分w
Azure Functionsも少し使っているので、今回の内容をAzure Functionsで実装してみるのも面白そうだなって思ってみたり...?