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

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

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

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC 4

ASP.NET MVC4は、MVCパターンを利用して、高度なテスト機能と保守機能を備えた Web アプリケーションを開発するためのフレームワークです。

Q&A

解決済

2回答

17353閲覧

Modelの型の検証を無効化・またはエラーメッセージを日本語にしたい

rina

総合スコア54

C#

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC 4

ASP.NET MVC4は、MVCパターンを利用して、高度なテスト機能と保守機能を備えた Web アプリケーションを開発するためのフレームワークです。

1グッド

0クリップ

投稿2018/09/12 08:10

編集2018/09/13 00:48

前提・実現したいこと

C# MVC4でWEBサイトの開発をしています。

intの項目に、数値でない文字を入力した際に、ModelStateに入るエラーメッセージが英語になってしまい困っています。
•The value '(入力値)' is not valid for 種別コード.

型の検証は行わないようにして、RegularExpressionの検証でチェックするようにしたいのですが、
やり方がわかりません。

もしくは、以下の日本語のメッセージが出るようにしたいです。
•値 '(入力値)' は 種別コード に対して無効です。

この日本語と英語はどこで判断しているのでしょうか?
(System.Threading.Thread.CurrentThread.CurrentUICultureは日本語になっていました。)

デバッグ中は日本語で表示されていて、発行したサイトだと英語になってしまいます。
それ以外のRequired等のエラーメッセージはちゃんと日本語になっています。

よろしくお願いします。


【追記】

追記依頼ありがとうございます。助かります。

発行は成功しています。

RegularExpressionよりも前に数値として無効の検証が動いてしまい困っています。
数値で7文字入力すると、RegularExpressionの検証が働き、期待通り"形式エラーです。"のメッセージが出ます。

該当のソースコード

C#

1 2 /// <summary> 3 /// モデルクラス 4 /// </summary> 5 public class KindModel 6 { 7 /// <summary> 8 /// コード 9 /// </summary> 10 [RegularExpression(@"[0-9]{1,6}", ErrorMessage = "形式エラーです。")] 11 [Display(ResourceType = typeof(Resources.Messages), Name = "InfoKindCode")] 12 public global::System.Int32 Code { get; set; } 13 14 /// <summary> 15 /// 名称 16 /// </summary> 17 [Display(ResourceType = typeof(Resources.Messages), Name = "InfoKindName")] 18 public global::System.String Name { get; set; } 19   } 20

cshtml

1 2@model KindModel 3@Html.ValidationSummary("", new { @class = "alert alert-danger" }) 4@using (Html.BeginForm("Create", "InfoKind", FormMethod.Post, new { @class = "form-horizontal" })) 5{ 6 @* コード *@ 7 <div class="form-group"> 8 @Html.LabelFor(m => m.Code, new { @class = "control-label required" }) 9 <div > 10 @Html.TextBoxFor(m => m.Code, new { @class = "form-control", maxlength = "6" }) 11 </div> 12 </div> 13 14 @* 名称 *@ 15 <div class="form-group"> 16 @Html.LabelFor(m => m.Name, new { @class = "control-label required" }) 17 <div> 18 @Html.TextBoxFor(m => m.Name, new { @class = "form-control" }) 19 </div> 20 </div> 21 22 <div class="form-group"> 23 <div> 24 <button type="submit" class="btn">新規登録</button> 25 </div> 26 </div> 27}

cshtml

1 2// @Html.TextBoxFor(m => m.Code, new { @class = "form-control", maxlength = "6" })の箇所 3<input name="Code" class="form-control" id="Code" type="text" maxlength="6" value="" data-val-required="コードは必須入力項目です。" data-val-regex-pattern="[0-9]{1,6}" data-val-regex="コードの入力形式が正しくありません。" data-val-number="The field コード must be a number." data-val="true"> 4
x_x👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/09/12 08:32

ASP.NET のタグを付けてください。
退会済みユーザー

退会済みユーザー

2018/09/12 08:41

RegularExpression 属性による検証ができないと言ってますか? 問題を再現するのに不要なものはどんどん削っていって(RegularExpression だけにするとか)試したらどうなりますか? Controller, View のコードはどうなってますか?
退会済みユーザー

退会済みユーザー

2018/09/12 08:48

html にレンダリングされたテキストボックスはどうなってますか? input type="number" とかなっていませんか?
x_x

2018/09/12 08:49

発行に失敗していませんか?
guest

回答2

0

ベストアンサー

【2019/2/4 訂正】今さらながらですが、以下のレスに間違いがあったので訂正させてください。質問者さんが書かれた「The value '(入力値)' is not valid for 種別コード.」というエラーはサーバー側の検証で出るものです。なので、EditorFor を使えば解決というのも間違っていました。詳しくは下の【2019/2/4 追記】を見てください。


TextBoxFor ではなくて EditorFor を使ったらどうなりますか? 下の【追伸】参照。やはり、解決策は EditorFor を使うということのようです。

自分の環境では、EditorFor を使うとテキストボックスは html ソースで input type="number" となります。data-val-number="The field 価格 must be a number." という属性も付与されますが、テキストボックスに数字以外を入力してもそのエラーメッセージが出てくることはないです。

Model のプロパティ

[Display(Name = "価格")] [Range(100, 10000, ErrorMessage = "{0}は{1}~{2}の間で入力してください。")] public int? Price { get; set; }

View

<div class="form-group"> @Html.LabelFor(model => model.Price, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" }) </div> </div>

html ソース

<div class="form-group"> <label class="control-label col-md-2" for="Price">価格</label> <div class="col-md-10"> <input class="form-control text-box single-line" data-val="true" data-val-number="The field 価格 must be a number." data-val-range="価格は100~10000の間で入力してください。" data-val-range-max="10000" data-val-range-min="100" id="Price" name="Price" type="number" value="2980" /> <span class="field-validation-valid text-danger" data-valmsg-for="Price" data-valmsg-replace="true"> </span> </div> </div>

IE11 で検証 
フォーカスを外すとクリアされる(テクストボックスは空白になる)。エラーメッセージは出ない。(注:ブラウザ依存。Chrome では数字以外入力できない)

イメージ説明

【追伸】

上のサンプルの EditorFor を TextBoxFor に代えて試してみましたが、質問者さんの問題を再現できました。IE11 の場合ですが、数字以外を入力してフォーカスを外すと以下の通りとなります。ちなみに、EditorFor の場合は、フォーカスを外すと入力した文字はクリアされます(テクストボックスは空白になる)。

イメージ説明

TextBoxFor に代えた場合いの html ソースは以下の通りです。

<div class="form-group"> <label class="control-label col-md-2" for="Price">価格</label> <div class="col-md-10"> <input data-val="true" data-val-number="The field 価格 must be a number." data-val-range="価格は100~10000の間で入力してください。" data-val-range-max="10000" data-val-range-min="100" htmlAttributes="{ class = form-control }" id="Price" name="Price" type="text" value="2980" /> <span class="field-validation-valid text-danger" data-valmsg-for="Price" data-valmsg-replace="true"> </span> </div> </div>

【2019/2/4 追記】

上のレスに間違いがあったので訂正させてください。

質問者さんが書かれた「The value '(入力値)' is not valid for 種別コード.」というエラーはサーバー側の検証で出るものでした。

View のコードに Html.EnableClientValidation(false); を追加するとクライアント側での検証に必要な属性(上の例で言うと data-val-number="The field 価格 must be a number.")は付与されなくなり、 クライアント側での検証は行われなくなります。

その場合、数字として不正な文字が混ざっていても POST されますのでサーバー側での検証が行われ、質問者さんが書かれた「The value '(入力値)' is not valid for 種別コード.」というエラーが出るということです。

これは EditorFor (type="number") でも TextBoxFor (type="text") でも同じで、数字として不正な文字が混ざって POST される限り避けようがないです。

また、クライアント側の検証に限っても、EditorFor を使えば解決するというのは間違いで、1x というような文字を入力すると、 IE11 の場合は "The field ID must be a number." というエラーメッセージが出てしまいます(x1 というように最初の文字が数字でない場合は上に述べた通り。また、ブラウザ依存で、Chrome の場合数字以外は入力できないなど動作に違いがあります)。

結局、int 型のクライアント側での検証は、モデルのプロパティに RequiredAttribute と RegularExpressionAttribute を付与してせれにエラーメッセージを設定し、View では TextBoxFor を使うのが正解だと思います。(int? 型の場合は RequiredAttribute は不要)

【2019/2/5 追記】

解決策ですが、数字として不正な文字が混ざって POST される限り「The value '(入力値)' is not valid for 種別コード.」というエラーが出るのは避けようがないので、エラーメッセージを日本語化する他なさそうです。

System.Web.Mvc.resources.dll の日本語のサテライトアセンブリを追加し(NuGet で Microsoft.AspNet.Mvc.ja をインストールすれば良いはず)、web.config に以下の設定を追加すれば日本語表示になると思います。

<globalization uiCulture="auto" culture="auto" />

MVC4でWEBサイトの開発をしています。
デバッグ中は日本語で表示されていて、発行したサイトだと英語になってしまいます。

MVC4 ということですから Visual Studio のテンプレートでプロジェクトを作った際にサテライトアセンブリはインストール済みのはずです。(ちなみに MVC5 では自分で NuGet から Microsoft.AspNet.Mvc.ja をインストールしないと日本語のサテライトアセンブリは bin フォルダにインストールされません)

たぶん、上の web.config の設定がなかったので、システムのロケールに該当するカルチャがスレッドに設定され、開発マシンの OS は日本語だからデバッグ中は日本語表示に、「発行したサイト」の OS は英語だから英語表示になったのだと思います。

bin フォルダごと運用サーバーに発行していればサテライトアセンブリも含まれているはずなので、ブラウザの言語設定が日本語であれば、web.config の設定だけで日本語表示になると思います。

Culture, UICulture を "auto" に設定すると、ASP.NET は、ブラウザから送信されてくる要求ヘッダに含まれる Accept-Language の設定を調べて、その要求を処理するスレッドのカルチャを Accept-Language に設定されているカルチャに書き換えます。

投稿2018/09/12 09:39

編集2019/02/05 06:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

rina

2018/09/13 00:36

回答ありがとうございます。 EditorForは自分も試していたのですが、 (試したこと、の欄に書いておくべきでした。。。大変失礼しました。) 数値でない場合にフォーカスアウト時に消える挙動が、あまり好ましくないと上から指摘を受け、 エラーメッセージをどうにかする方向で調べていたのですが、EditorForが正統法なのですね。 もう一度確認してみます。 また、Chrome では数字以外入力できないようになるのですね、 これならOKかと思うのですが、IE... わざわざ試してみてくださって感動です。 見落としていたことにも気付けて、とても助かりました。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/09/13 00:50

大変失礼はその通り。次回はそういうことの無いようお願いします。 その他の解決策として、クライアント側での検証を無効にするぐらいしか思い付かないですね(未検証) これも試した上?
rina

2018/09/13 01:04

はい、本当に申し訳ありませんでした・・・ クライアント側での検証を無効にすることは思いつきませんでした。 (というか、クライアント側の認証という認識がなく・・・) 今、Html.EnableClientValidation(false)を入れて試してみたのですが、これだと変わらないようでした。 コメントありがとうございます。
退会済みユーザー

退会済みユーザー

2018/09/13 01:44

クライアント側での検証を無効にすると data-val-* というクライアント側での検証に必要な属性(data-val-number="The field コード must be a number." を含む)は付与されなくなるのですが? 詳しくは以下の記事を見てください。 クライアント側検証の無効化 http://surferonwww.info/BlogEngine/post/2015/02/17/disable-client-side-validation-in-mvc4-internet-application.aspx それでもなお "The field コード must be a number." というエラーメッセージが出るのですか?  確認して下さい。
rina

2019/04/02 03:21

返信が遅くなり申し訳ありません。 また、追記いただきありがとうございます。 >System.Web.Mvc.resources.dll の日本語のサテライトアセンブリを追加し(NuGet で Microsoft.AspNet.Mvc.ja をインストールすれば良いはず)、web.config に以下の設定を追加すれば日本語表示になると思います。 まさに求めていた回答です!ありがとうございます。 >開発マシンの OS は日本語だからデバッグ中は日本語表示に、「発行したサイト」の OS は英語だから英語表示になったのだと思います。 これについても実際の環境を確認したところ、その通りでした。 とても勉強になりました。ありがとうございます。
guest

0

実行環境を日本語にできれば一番いいのですが、こんな情報がありました。
https://stackoverflow.com/questions/4828297/how-to-change-data-val-number-message-validation-in-mvc-while-it-is-generated

投稿2018/09/12 09:09

x_x

総合スコア13749

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

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

rina

2018/09/13 00:40

回答ありがとうございます。 実行環境の、日本語の設定が、どこを指しているかわからず... (System.Threading.Thread.CurrentThread.CurrentUICultureは日本語、IEのインターネットオプションから言語を見ると日本語) サイト、参考にさせていただきます。 調べてくださって本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問