C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

モデルのプロパティに対するアノテーション記述

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■95614 / inTopicNo.1)  モデルのプロパティに対するアノテーション記述
  
□投稿者/ はきゅ (1回)-(2020/08/26(Wed) 12:45:03)

分類:[C#] 

お世話になります。

ASP.NET MVC(C#)を使用して開発しているのですが、

よくWEBの記事で以下のようなモデルのプロパティに対するアノテーション記述を見かけます。

[DisplayName("書名")]
[Required(ErrorMessage="{0}は必須です。")]
[StringLength(100, ErrorMessage="{0}は{1}文字以内で入力してください。")]
public string Title { get; set; }

ここで{0}、{1}はそれぞれ"書名"、"100"となるかと思いますが、
{0}が"書名"、{1}が"100"というのはどこで決まるのでしょうか?
仮に、

[Required(ErrorMessage="{0}は必須です。")]
[StringLength(100, ErrorMessage="{0}は{1}文字以内で入力してください。")]
[DisplayName("書名")]
public string Title { get; set; }

と記述された場合でも{0}{1}の値は変わらないようです。

プレースホルダーという指定方法のようですが、ネット上では、

String.Format("私の名前は {0} {1} です。", "Yamada", "Hanako");

というような記述しか見つけられず、しかもこちらは、カンマ区切りの順番通りになるようでした。

モデル内での属性などによって順番が決まっているということでしょうか?
何か情報ありましたら教えて頂けると助かります。

宜しくお願い致します。

引用返信 編集キー/
■95615 / inTopicNo.2)  Re[1]: モデルのプロパティに対するアノテーション記述
□投稿者/ Hongliang (1083回)-(2020/08/26(Wed) 12:55:57)
属性を定義しているクラスによってプレースホルダーに与えられる値が決められています。
通常、ドキュメントに説明があります。
例えばStringLength属性は以下のページの注釈のところ。
https://docs.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations.stringlengthattribute
引用返信 編集キー/
■95616 / inTopicNo.3)  Re[1]: モデルのプロパティに対するアノテーション記述
□投稿者/ WebSurfer (2095回)-(2020/08/26(Wed) 13:19:05)
No95614 (はきゅ さん) に返信

> ここで{0}、{1}はそれぞれ"書名"、"100"となるかと思いますが、
> {0}が"書名"、{1}が"100"というのはどこで決まるのでしょうか?

以下の記事が参考になると思います。「B エラー・メッセージを整形するのはFormatErrorMessage
メソッド」あたりに注目してください。

第4回 検証属性の自作とクラス・レベルのモデル検証
https://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_05/aspnetmvc3_05_01.html

上記は .NET Framework 版の MVC アプリの記事ですが Core 3.1 でもほぼ同様です。

ASP.NET Core MVC 検証属性の自作
http://surferonwww.info/BlogEngine/post/2020/02/03/aspnet-core-mvc-custom-validation-attribute.aspx

引用返信 編集キー/
■95619 / inTopicNo.4)  Re[2]: モデルのプロパティに対するアノテーション記述
□投稿者/ はきゅ (2回)-(2020/08/26(Wed) 15:18:53)
Hongliangさん、WebSurferさん

ありがとうございます。
リンク先を見させて頂きました。
属性クラス内のFormatErrorMessageメソッドの中で、String.Formatの引数として渡されている値(順番)で決まるということでしょうか。

その場合、自作の属性では無い場合(例えば「MaxLengthAttributeクラス」など)、
どのようにFormatErrorMessageメソッドが設定されているか、確認する手段はあるのでしょうか。

StringLength属性は教えて頂いた通り、注釈部分に記載がありましたが、
以下の通り、MaxLength属性やMinLength属性、その他の属性は記載が無いようです。
(FormatErrorMessageメソッドの説明ページにもありませんでした。)
https://docs.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations.minlengthattribute?view=netcore-3.1

実際やってみるとLengthプロパティは{1}で取れるようなのですが。

これは、色々試して覚えるしかないのでしょうか。。。


引用返信 編集キー/
■95620 / inTopicNo.5)  Re[3]: モデルのプロパティに対するアノテーション記述
□投稿者/ 魔界の仮面弁士 (2821回)-(2020/08/26(Wed) 15:24:36)
No95619 (はきゅ さん) に返信
> その場合、自作の属性では無い場合(例えば「MaxLengthAttributeクラス」など)、
> どのようにFormatErrorMessageメソッドが設定されているか、確認する手段はあるのでしょうか。

ソースを読んでみるとか?

.NET Core
https://source.dot.net/#System.ComponentModel.Annotations/System/ComponentModel/DataAnnotations/MaxLengthAttribute.cs,96

.NET Framework
https://referencesource.microsoft.com/#System.ComponentModel.DataAnnotations/DataAnnotations/MaxLengthAttribute.cs,84
引用返信 編集キー/
■95622 / inTopicNo.6)  Re[3]: モデルのプロパティに対するアノテーション記述
□投稿者/ WebSurfer (2096回)-(2020/08/26(Wed) 16:04:18)
No95619 (はきゅ さん) に返信

> その場合、自作の属性では無い場合(例えば「MaxLengthAttributeクラス」など)、
> どのようにFormatErrorMessageメソッドが設定されているか、確認する手段はあるのでしょうか。

紹介した @IT の記事に「デフォルトでは、プレイスホルダ“{0}”に対して表示名を割り当てる
だけ」と書いてある通りだと思います。基本はこれだと思っておけばいいのでは?

質問者さんが最初の質問で書いていた StringLengthAttribute は @IT の記事に「そのほかの
パラメータ値を割り当てたい場合には、自分でオーバーライドして整形ルールを変更する必要が
ある」と書いてあるように override しているのだと思います。

その場合は Microsoft のドキュメントの注釈に書いてあると思います(全部もれなく書いてあ
るかは分かりませんが)

StringLengthAttribute クラス
https://docs.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations.stringlengthattribute?view=netframework-4.8

"エラーメッセージには、複合書式指定プレースホルダーを使用できます。 {0} はプロパティ
の名前です。{1} は最大長です。と {2} が最小の長さです。"
引用返信 編集キー/
■95623 / inTopicNo.7)  Re[4]: モデルのプロパティに対するアノテーション記述
□投稿者/ はきゅ (3回)-(2020/08/26(Wed) 16:31:52)
> 魔界の仮面弁士さん

ありがとうございます。
ソースを見て納得できました。
こんなサイトがあるんですね。


> WebSurferさん

ありがとうございます。
ソースを見て、たしかにoverrideされていました。
皆さん、どうやってドキュメントにも記載のないoverrideされている仕様を把握されているか不思議でした。
ソースを見てたんですかね。
本件自体は、ちょっと試せば分かる話ではありますが。。


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ