

ASP.NET Core v1.1で数値型の場合、自動で付加されるValidationの文字列がありますが、これを日本語に変更する方法はありますか？

[例]  
■ビューモデル(抜粋)

[code]

    public class SampleViewModel
    {
        [DisplayName("値")]
        [RegularExpression("^[-.0-9]*$", ErrorMessage = "値は数値を入力してください。")]
        public float? Value { get; set; }
    }
    
[/code]

■ビュー(抜粋)

[code]

    <td>
        @Html.DisplayFor(model.Value)
    </td>
    
[/code]

■表示結果のHTMLコード

[code]

    <div class="form-group">
        <label class="col-md-2 control-label" for="Value">値</label>
        <div class="col-md-10">
            <input class="form-control" type="text" data-val="true" data-val-number="The field 値 must be a number." data-val-regex="値は数値を入力してください。" data-val-regex-pattern="^[-.0-9]*$" id="Value" name="Value" value="">
            <span class="text-danger field-validation-valid" data-valmsg-for="Value" data-valmsg-replace="true"></span>
        </div>
    </div>
    
[/code]

上記表示結果に  
**data-val-number="The field 値 must be a number."**  
といった具合に、英語表記された箇所があります。これが画面に出力されてしまうのです。。。

また、例のビューモデルのようにRegularExpressionを使えばある程度は防げるのですが、あまりスマートな方法ではなく（不要なValidationを付加させてますし、ビューモデルに必ず定義する手間もありますし）、「data-
val-number」のエラーメッセージそのものを自動で上書きしたいと思っております。

色々調べてみましたが、ASP.NETのバージョンも多岐に渡っており、またバージョンごとに非互換も多く、最新のCoreで実現可能かつ”スマートな方法”が見つかりませんでした。  
（.NET CoreのResources.resxをオーバーライドできればスマートな方法だと考えています…）


CC BY-SA 3.0
2017-04-28T00:41:14.363
34338
2017-04-29T17:07:25.690
20991
question
asp.net
Validationの文字列を日本語にしたい


すみません。トライ＆エラーしていく中で自己解決してしまいましたので回答として掲載しておきます。  
もっと上手いやり方があればご教授頂けると幸いです。m(__)m  
IModelBindingMessageProviderをDependencyInjectionする方法とか...かな？

Startup.cs（抜粋）

[code]

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc(setup =>
        {
            var modelBindingMessageProvider = new ModelBindingMessageProviderLocalization();
            setup.ModelBindingMessageProvider.ValueMustBeANumberAccessor = modelBindingMessageProvider.ValueMustBeANumberAccessor;
        });
    }
    
[/code]

ModelBindingMessageProviderLocalization.cs（抜粋）

[code]

    public class ModelBindingMessageProviderLocalization
    {
        private Func<string, string> _valueMustBeANumberAccessor;
    
        public ModelBindingMessageProviderLocalization()
        {
            ValueMustBeANumberAccessor = Resources.FormatHtmlGeneration_ValueMustBeNumber;
        }
    
        public Func<string, string> ValueMustBeANumberAccessor
        {
            get
            {
                return _valueMustBeANumberAccessor;
            }
            set
            {
                if (value == null)
                {
                    throw new ArgumentNullException(nameof(value));
                }
    
                _valueMustBeANumberAccessor = value;
            }
        }
    }
    
[/code]

Resources.resx（抜粋）

[code]

      <data name="HtmlGeneration_ValueMustBeNumber" xml:space="preserve">
        <value>{0} は数値を入力してください。</value>
      </data>
    
[/code]

Resources.Designer.cs（抜粋）

[code]

        /// <summary>
        /// The field {0} must be a number.
        /// </summary>
        internal static string HtmlGeneration_ValueMustBeNumber
        {
            get => ResourceManager.GetString("HtmlGeneration_ValueMustBeNumber");
        }
    
        /// <summary>
        /// The field {0} must be a number.
        /// </summary>
        internal static string FormatHtmlGeneration_ValueMustBeNumber(object p0)
            => string.Format(CultureInfo.CurrentCulture, ResourceManager.GetString("HtmlGeneration_ValueMustBeNumber"), p0);
    
[/code]

■実行結果

[![実行結果](https://i.stack.imgur.com/8SVZr.png)](https://i.stack.imgur.com/8SVZr.png)

※今回は「"The field 値 must be a
number."」というメッセージを書き換えるのが目的でしたが、ModelBindingMessageProviderは以下のメッセージを管理していますので、それらのメッセージを書き換える場合は同様にコードを記述すれば良いかと思われます。

[code]

    上段：プロパティ名とリソース名
    下段：メッセージ
    
    MissingBindRequiredValueAccessor = Resources.FormatModelBinding_MissingBindRequiredMember;
    A value for the '{0}' property was not provided.
    
    MissingKeyOrValueAccessor = Resources.FormatKeyValuePair_BothKeyAndValueMustBePresent;
    A value is required.
    
    MissingRequestBodyRequiredValueAccessor = Resources.FormatModelBinding_MissingRequestBodyRequiredMember;
    A non-empty request body is required.
    
    ValueMustNotBeNullAccessor = Resources.FormatModelBinding_NullValueNotValid;
    The value '{0}' is invalid.
    
    AttemptedValueIsInvalidAccessor = Resources.FormatModelState_AttemptedValueIsInvalid;
    The value '{0}' is not valid for {1}.
    
    UnknownValueIsInvalidAccessor = Resources.FormatModelState_UnknownValueIsInvalid;
    The supplied value is invalid for {0}.
    
    ValueIsInvalidAccessor = Resources.FormatHtmlGeneration_ValueIsInvalid;
    The value '{0}' is invalid.
    
    ValueMustBeANumberAccessor = Resources.FormatHtmlGeneration_ValueMustBeNumber;
    The field {0} must be a number.
    
[/code]

<https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Metadata/ModelBindingMessageProvider.cs>  
<https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Core/Resources.resx>  
から引用


CC BY-SA 3.0
2017-04-29T17:07:25.690
34382
2017-04-29T17:07:25.690
20991
34338
answer