モデルクラス内の入力必須プロパティを、局所的に無効化する方法です。
始めに
ASP.NET Core とは、C# と HTML の組み合わせでウェブアプリが作れるフレームワークです。
本稿では ASP.NET Core の中でも、「Razor ページ」という仕組みを取り上げます。
(具体的には、下記チュートリアルの「パート3」まで理解している程度を想定しております)
Required 属性とは
RequiredAttribute
は、null
の格納を認めないデータに付与するための属性です。
Movie.cs
内のTitle
プロパティに、Required
属性を与えてみましょう。
/Movie/Movie.cs
[Required(ErrorMessage = "The Title field is required.")] public string Title { get; set; }
この状態でデータを新規作成すると、下図のようにエラーメッセージが表示されます。
ReleaseDate
やPrice
にもエラーメッセージが出ているのは、そもそもnull
非許容型であるためです。
新しい項目の追加
本題の「入力必須だが局所的に無効化する」という要素を考えてみます。
例えば、Summary
(概要)という項目はいかがでしょう。
「映画リストには必要だが、リスト追加時には取りあえず入力しなくてよい」といった考えかたが出来ます。
下記のようにSummary
プロパティを追加し、Create.cshtml
はそのままでリストを追加してみましょう。
/Movie/Movie.cs
[Required(ErrorMessage = "The Summary field is required.")] public string Summary { get; set; }
おそらく画面が切り替わらず、リストも更新されないはずです。
これはCreate.cshtml.cs
のOnPostAsync()
メソッド内で、フォーム送信時のエラーを検知しているためです。
/Pages/Movies/Create.cshtml.cs
if (!ModelState.IsValid) { return Page(); }
Summary
がnull
のままフォームが送信されたため、IsValid
がfalse
を返しているわけですね。
ここでいよいよ、一時的にnull
を許可する方法の出番です。
一時的にnull
を許可する
前項のIsValid
検出前に、ModelState.Remove()
を記述します。
プロパティ名をパラメータに取る事で、指定したプロパティのnull
チェックが行われなくなります。
同時にSummary
には適当な値を代入する事で、フォームに存在しない入力必須項目を無視できます。
/Pages/Movies/Create.cshtml.cs
ModelState.Remove($"{nameof(Movie)}.{nameof(Movie.Summary)}"); Movie.Summary = $"({nameof(Movie.Summary)} of \"{Movie.Title}\")"; if (!ModelState.IsValid) { return Page(); }
Summary
への代入は宣言時の初期化でも行えますが、上記のように変数を含む場合はこのタイミングが良いと思います。
最後にEdit.cshtml
にSummary
の編集フォームを追加して、編集画面を確認しましょう。
ModelState.Remove()
によってSummary
の入力必須状態が無効化されたのは新規作成時のみなので、編集時は元どおり入力必須になっています。
終わりに
作例ではいまいち実用性が感じられませんが、覚えておくとどこかで使えるかもしれませんよ。
以上、入力必須プロパティを局所的に無効化する方法でした。