質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

3460閲覧

定数をstring.Formatで作りたい。

seventy

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/04/18 02:55

前提・実現したいこと

C#の定数について教えてください。

発生している問題・エラーメッセージ

定数に、string.Formatした文字列を設定したところ、

constに割り当てられた式は定数でなければなりません。

とエラーになりました。

該当のソースコード

C#

1 [MaxLength(30, ErrorMessage = "タイトルは30文字以内で入力してください。")] 2 public string Title { get; set; } 3 4 [MaxLength(100, ErrorMessage = "内容は100文字以内で入力してください。")] 5 public string Contents { get; set; }

これを下記のようにしたい。

c#

1 static int length = 30; 2 static string title = "タイトル"; 3 static string errormessage = string.Format("{0}は{1}文字以内で入力してください。", title, length); 4 [MaxLength(length, ErrorMessage = errormessage)] 5 [Display(Name = title)] 6 7 static int length2 = 100; 8 static string title2 = "内容"; 9 static string errormessage2 = string.Format("{0}は{1}文字以内で入力してください。", title2, length2); 10 [MaxLength(length2, ErrorMessage = errormessage2)] 11 public string Contents { get; set; }

試したこと

C#

1 const int length = 30; 2 const string consttitle = "タイトル"; 3 const string errormessage = string.Format("{0}は{1}文字以内で入力してください。", consttitle, length); 4 [MaxLength(length, ErrorMessage = consterrormessage)] 5 public string Title { get; set; }

これだと、

属性引数は、定数式、typeof式、または属性パラメーター形の配列の作成式でなければなりません。 constに割り当てられた式は定数でなければなりません。

とエラーがふたつです。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2017 Pro

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/18 05:05

ASP.NET MVC の話でしたら ASP.NET のタグをつけてください。
seventy

2018/04/18 07:13

ASP.NET MVCの話の続きですが、直接は関係ないのかなと思ってつけませんでした。
guest

回答3

0

ASP.NET MVC のデータアノテーション検証の話と理解してレスします。

定数に、string.Formatした文字列を設定したところ

String.Format など使わなくても望むことができるはずです。

例としてですが、MaxLength ではなくて StringLength を使って以下のようにしてはいかがですか? これでクライアント側でもサーバー側でも検証がかかり、望むエラーメッセージが表示されるはずです。

[Required(ErrorMessage = "{0} は必須")] [StringLength(15, ErrorMessage = "{0} は {1} 文字以内")] [Display(Name = "国名")] public String Name { get; set; }

結果は以下の記事の画像を見てください。

コレクションのデータアノテーション検証
http://surferonwww.info/BlogEngine/post/2014/09/01/validation-of-collection-data-during-model-binding-using-data-annotation.aspx

参考までに、Model のコード内にエラーメッセージをハードコーディングしたくない場合はリソースファイル (.resx) を作って使うという方法もあります。興味があれば以下の記事を見てください。

データアノテーション検証の多言語対応
http://surferonwww.info/BlogEngine/post/2014/09/11/multi-languages-message-for-data-annotation.aspx

投稿2018/04/18 05:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seventy

2018/04/18 07:11

ありがとうございます。記事、とても参考になりました。
guest

0

ベストアンサー

DisplayNameAttributeを使用することで表示時の名称を指定することが可能です。

C#

1 const int length = 30; 2 const string consttitle = "タイトル"; 3 const string errormessage = "{0}は{1}文字以内で入力してください。"; 4 [Display(Name = consttitle)] 5 [MaxLength(length, ErrorMessage = errormessage)] 6 public string Title { get; set; }

投稿2018/04/18 04:42

evin101

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/18 06:12

ASP.NET MVC の検証の話であれば、MaxLength ではなくて StringLength を使った方がよさそうです。 MaxLength を使うと、MVC4 以前では、クライアント側での検証がかからない(検証のための属性が input 要素に付与されない)ので注意してください。
seventy

2018/04/18 07:13

ありがとうございます。
guest

0

コンパイル時に文字が確定している必要があるため、 String.Format() はできません。

https://stackoverflow.com/questions/31843962/why-cant-i-use-string-interpolation-in-an-attribute

ただ以下のコードなら大丈夫みたいです。

csharp

1const string len = "30"; 2const string msg = "字以内に〜" 3 4[MaxLength("タイトルは" + len + msg)] 5public string Title {get;set;}

回答修正しました。
以下のページの様に MaxLengthAttrebute を継承してみてはどうでしょう?(チェックが動くかは未検証)
https://stackoverflow.com/questions/20022553/c-sharp-extend-mvc-maxlengthattribute-with-own-error-message

投稿2018/04/18 03:40

編集2018/04/18 03:58
gaya-K

総合スコア449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問