【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
->Title
、URL
->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.cs
の titleList
を作ることとほぼ同義です。
⑦と同様、最初に値をセットした後に変更することはないので、同じくコンストラクタでのみ値をセットします。
そして、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
へ変更
foreach
は IEnumerable
インターフェースを介して要素へのアクセスできます。
今回は全て自分が作ったのでList<Title>
で型変換かけているが、チーム開発をするという観点からするとキケン。
Index.cshtml
はAさんが作ってて IndexViewModel.cs
はBさんが作ってるのような状況で、コミュニケーションロスが発生すると
ViewData
は場合によっては配列でこないかもしれない…ことが起こりうるわけです。
場合によっては、型を縛りすぎない実装も必要だと学びました。
転職して1ヶ月半経ちました。
実務もぼちぼち入ってきて、わからないながらもC#の深みに少しずつ片足突っ込みつつあります、多分w
Azure Functionsも少し使っているので、今回の内容をAzure Functionsで実装してみるのも面白そうだなって思ってみたり...?