none
ASP.NET MVC5 でVaridateメッセージが英語 RRS feed

  • 質問

  • いつもお世話になります。

    ASP.NET MVC5の学習を初めようと思い、
    以下のスライドを元にサンプルを作成していたところ、一部挙動が違うため、
    理由が知りたいです。

    <サンプル全体のスライド>
    http://www.slideshare.net/fullscreen/tmizoe/aspnet-mvc5/

    環境はVisualStudio 2015 Professionalです。
    具体的にはサンプルのものが「~は日付であります」のように、
    Varidationメッセージが日本語であるのに対し、
    私の環境では英語で表示されてしまっています。
    この差は何が原因なのでしょうか。
    変に英語環境にインストールされているなら、治したいと考えています。

    <サンプルの画像>

    <私の環境の画像>

    初歩的な質問で恐縮ですが
    ご教授いただけませんか。

    2016年3月6日 7:43

回答

  • 検証してみましたが、私の環境でもエラーは英語で表示されました(Visual Studio Enterprise 2015, Win10の2台で再現)。色々と調べてみましたがスライドのサンプルは、Visual Studio Express 2013 for Webで作成されたサンプルのようなので、VS2015とは動作が異なっている可能性があります。

    そして、どうもビルドしたときにbinフォルダに"System.Web.Mvc.resources.dll"が生成されていないとき入力値に対する既定のエラーメッセージが英語で表示されるようです。

    これを解消するには、プロジェクトの参照に"System.Web.Mvc.resources.dll"を追加します。

    1. プロジェクトエクスプローラの「参照」を右クリックし「参照の追加」を選択
    2. ダイアログの下側の「参照...」ボタンをクリック
    3. プロジェクトフォルダと同じフォルダ階層に"packages"というフォルダが生成されているかと思いますが、その中の"Microsoft.AspNet.Mvc.ja.5.2.3\lib\net45\ja\System.Web.Mvc.resources.dll"を選択して参照を追加します。
    4. プロジェクトをリビルドしてエラーメッセージを確認する

    ※上記パスにSystem.Web.Mvc.resources.dllが存在しないときは、nugetのコマンドで取得できるかと思います。https://www.nuget.org/packages/Microsoft.AspNet.Mvc.ja

    ※参照に追加しなくてもSystem.Web.Mvc.resources.dllをエクスプローラでbinフォルダへコピーすると実行時に勝手に読み込まれるようです。



    2016年3月6日 16:06
  • 確認いただきありがとうございました。

    Visual Studio 2015, MVC5 の環境を持ってない自分は確認しようがなかったので助かりました。

    日本語のサテライトアセンブリが設定されないと言うことは、MVC5 以降ではデフォルトの(英語の)エラーメッセージ以外はサポートしなくなったという話なのでしょうかね・・・(ググって調べてもそういう話は見つかりませんでしたが)

    何にせよ、デフォルトのエラーメッセージに頼らないで、

    (1) 自分で ErrorMessage プロパティにエラーメッセージを設定する。

    (2) エラーメッセージをハードコーディングしたくない場合は自分でリソースファイル (.resx) を作って使う。

    (3) 多言語化する場合は自分でリソースファイルを追加してサテライトアセンブリを作って使う。

    というようにした方がよさそうだと思いました。

    • 回答としてマーク Masato0407 2016年3月9日 10:21
    2016年3月8日 3:27

すべての返信

  • > 以下のスライドを元にサンプルを作成していたところ、一部挙動が違うため、
    > 理由が知りたいです。

    115 ページものスライドを読むのは大変なのですが・・・

    なのですみませんが、読まずにまず一般的な話をします。ハズレだったら済みません。

    普通そのようなエラーメッセージは、Model のパブリックプロパティに付与したデータアノテーション属性によって自動的に検証用のスクリプトが生成され、クライアント側で検証された結果としてデータアノテーション属性に設定したメッセージが表示されるはずです。

    クライアント側での検証を無効にしてあればサーバー側で検証されて、その結果としてデータアノテーション属性に設定したメッセージが表示されるはずです。

    なので、まずデータアノテーション属性の設定がどのようになっているかをチェックしてはいかがですか?

    記事としてはちょっと古いのですが、Microsoft が提供する以下のチュートリアルがまとまっていて理解しやすいと思います。

    [C#] #21. データ アノテーション検証コントロールでの検証
    https://technet.microsoft.com/ja-jp/subscriptions/ff642519.aspx

    その他、自分のブログで恐縮ですが、以下の記事も参考になるのではと思います。

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

    エラーメッセージは Model にハードコーディングしないで、リソースファイルから取得することも可能です。そのあたりも今回の問題と関係あるかもしれません。リソースファイルの設定に関して、詳しくは以下の記事を見てください。

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

    2016年3月6日 12:28
  • 失礼しました。

    モデルクラスのコードを記載すべきでした。

    namespace MvcMovie.Models
    {
        public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; }
            [Display(Name ="リリースの日")]
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; }
            [DataType(DataType.Currency)]
            public decimal Price { get; set; }
        }
        public class MovieDBContext: DbContext
        {
            public DbSet<Movie> Movies { get; set; }
        }

    紹介いただいたページの内容を踏まえ、再度要約させていただきますと、

    ErrorMessage プロパティにカスタムのエラー メッセージを設定していない状況において、
    バリデーションエラーのメッセージが英語で表示されてしまっていることに疑問を感じています。

    サンプルの実行画面のスクリーンショットでは日本語で表示されているので、
    私のコードではなく、インストールされたVisualStudioのバージョンや設定に
    問題があるのではと考えています。

    もしかするとおかしいのはサンプルで、
    私の環境のようにErrorMessageプロパティーでカスタムのエラーメッセージを設定していない状況においては
    英語でエラーメッセージが表示されるのが一般的なのでしょうか。

    紹介いただいた以下のリンクには英語で表示されるような記載がありました。

    [C#] #21. データ アノテーション検証コントロールでの検証
    https://technet.microsoft.com/ja-jp/subscriptions/ff642519.aspx

    ErrorMessageプロパティーでカスタムのエラーメッセージを設定していない状況においてのエラーメッセージは
    サンプルのように日本語表示が標準でしょうか。
    それとも私の環境のように英語表示が標準でしょうか。

    2016年3月6日 15:46
  • 検証してみましたが、私の環境でもエラーは英語で表示されました(Visual Studio Enterprise 2015, Win10の2台で再現)。色々と調べてみましたがスライドのサンプルは、Visual Studio Express 2013 for Webで作成されたサンプルのようなので、VS2015とは動作が異なっている可能性があります。

    そして、どうもビルドしたときにbinフォルダに"System.Web.Mvc.resources.dll"が生成されていないとき入力値に対する既定のエラーメッセージが英語で表示されるようです。

    これを解消するには、プロジェクトの参照に"System.Web.Mvc.resources.dll"を追加します。

    1. プロジェクトエクスプローラの「参照」を右クリックし「参照の追加」を選択
    2. ダイアログの下側の「参照...」ボタンをクリック
    3. プロジェクトフォルダと同じフォルダ階層に"packages"というフォルダが生成されているかと思いますが、その中の"Microsoft.AspNet.Mvc.ja.5.2.3\lib\net45\ja\System.Web.Mvc.resources.dll"を選択して参照を追加します。
    4. プロジェクトをリビルドしてエラーメッセージを確認する

    ※上記パスにSystem.Web.Mvc.resources.dllが存在しないときは、nugetのコマンドで取得できるかと思います。https://www.nuget.org/packages/Microsoft.AspNet.Mvc.ja

    ※参照に追加しなくてもSystem.Web.Mvc.resources.dllをエクスプローラでbinフォルダへコピーすると実行時に勝手に読み込まれるようです。



    2016年3月6日 16:06
  • 返信ありがとうございます。

    ご指摘の通り、System.Web.Mvc.resorces への参照が抜けておりました。
    追加したところエラーメッセージが日本語表示されました。

    私が参照しましたサンプルはこの手順が暗黙的に行われていたんでしょうね。

    ありがとうございました。

    2016年3月6日 17:03
  • > これを解消するには、プロジェクトの参照に"System.Web.Mvc.resources.dll"を追加します。

    テンプレートが違うということはないですか?

    MVC4 の場合ですが、下の記事の 2 番目の画像を見てください。

    VS2010 で ASP.NET MVC 4
    http://surferonwww.info/BlogEngine/post/2014/07/14/aspnet-mvc-4-on-visual-studio-2010-professional.aspx

    「インターネットアプリケーション」「イントラネットアプリケーション」「Web API」で作ると bin フォルダに ja というサブフォルダが生成され、その中に日本語のサテライトアセンブリが自動的に配置されます。(格納されるファイルは微妙に違いますが "System.Web.Mvc.resources.dll" はいずれのテンプレートで作っても含まれます)

    以下の画像は「インターネットアプリケーション」で作った時のものです。自力で「プロジェクトの参照に"System.Web.Mvc.resources.dll"を追加」という操作は必要なく、[テンプレートの選択(S):]で「インターネットアプリケーション」を選んで[OK]ボタンをクリックすれば後は Visual Studio が自動で設定してくれます。

    ちなみに、「空」と「基本」はダメです。(ja フォルダは生成されません。サテライトアセンブリも配置されません)

    MVC5 は確認していませんが、MVC4 からそのあたりを変えたとは考えにくいです。「空」とか「基本」で作ってないか確認をお願いします。


    • 編集済み SurferOnWww 2016年3月10日 2:02 画像リンク切れ修正
    2016年3月7日 3:19
  • VS2013とVS2015で試してみました。スライドのプロジェクト作成方法は

    SurferOnWwwさんと確かに選んでいるテンプレートが異なるようです。

    VS2013、VS2015ともに「新しいプロジェクト」のダイアログで「ASP.NET Web アプリケーション」を選んだ後、

    次のような画面でMVCを選択してプロジェクトを作成していますが、

    この方法だとSystem.Web.Mvc.resources.dllは含まれないようです。

    VS2013にて「新しいプロジェクト」のダイアログで「ASP.NET MVC 4 Web アプリケーション」を選択し、次の画面で「インターネット アプリケーション」を選択してプロジェクトを作成するとbinフォルダにjpフォルダが作成されその中にSystem.Web.Mvc.resources.dllが含まれたプロジェクトが作成されました。

    2016年3月7日 15:13
  • 確認いただきありがとうございました。

    Visual Studio 2015, MVC5 の環境を持ってない自分は確認しようがなかったので助かりました。

    日本語のサテライトアセンブリが設定されないと言うことは、MVC5 以降ではデフォルトの(英語の)エラーメッセージ以外はサポートしなくなったという話なのでしょうかね・・・(ググって調べてもそういう話は見つかりませんでしたが)

    何にせよ、デフォルトのエラーメッセージに頼らないで、

    (1) 自分で ErrorMessage プロパティにエラーメッセージを設定する。

    (2) エラーメッセージをハードコーディングしたくない場合は自分でリソースファイル (.resx) を作って使う。

    (3) 多言語化する場合は自分でリソースファイルを追加してサテライトアセンブリを作って使う。

    というようにした方がよさそうだと思いました。

    • 回答としてマーク Masato0407 2016年3月9日 10:21
    2016年3月8日 3:27
  • MVC4 でデフォルトのエラーメッセージをちょっと調べてみました。

    「フィールド PassWord は正規表現 '^(?=.*\d)(?=.*[A-Z])[A-Z0-9]{4,8}$' と一致する必要があります。」とか言われても一般ユーザーには訳がわからないし、ローカル化されてないエラーメッセージもあるし、使い物にならないような感じです。

    そういうこともあってサテライトアセンブリを自動的に追加するようなことは止めたのかもしれませんね。


    【追伸】

    上の画像で、Model のパブリックプロパティに付与したデータアノテーション属性は以下の通りです。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    
    namespace Mvc4App2.Models
    {
        public class DefaultErrorMessage
        {
            [Required]
            public string Name { get; set; }
    
            [Required]
            [DataType(DataType.Password)]
            [RegularExpression(@"^(?=.*\d)(?=.*[A-Z])[A-Z0-9]{4,8}$")]
            public string PassWord { get; set; }
    
            [DataType(DataType.EmailAddress)]
            public string Email { get; set; }
    
            [DataType(DataType.PhoneNumber)]
            public string Phone { get; set; }
    
            [DataType(DataType.Date)]
            public DateTime BirthDate { get; set; }
    
            [DataType(DataType.Url)]
            public string Url { get; set; }
    
            [StringLength(10)]
            [DataType(DataType.MultilineText)]
            public string Message { get; set; }
        }
    }

    • 編集済み SurferOnWww 2016年3月8日 9:13 追伸追加
    2016年3月8日 8:44