76

次のモデルを想定します。

Public Class Detail
    ...
    <DisplayName("Custom DisplayName")>
    <Required(ErrorMessage:="Custom ErrorMessage")>
    Public Property PercentChange As Integer
    ...
end class

とビュー:

@Html.TextBoxFor(Function(m) m.PercentChange)

このhtmlを続行します:

   <input data-val="true" 
    data-val-number="The field 'Custom DisplayName' must be a number." 
    data-val-required="Custom ErrorMessage"     
    id="PercentChange" 
    name="PercentChange" type="text" value="0" />

が. data-val-number_ PercentChange_ Integer私はそれを変更するためにそのような属性を探していましたが、range関連するものは何でも機能しません。
unobtrusive の js ファイル自体を編集するか、クライアント側でオーバーライドする可能性があることはわかっています。data-val-numberサーバー側の他のエラー メッセージと同じように のエラー メッセージを変更したい。

4

14 に答える 14

79

フィールドをレンダリングするときにdata-val-number属性を自分で指定することにより、メッセージをオーバーライドできます。これはデフォルトのメッセージを上書きします。これは、少なくとも MVC 4 で機能します。

@Html.EditorFor(model => model.MyNumberField, new { data_val_number="整数を指定してください!" })

Razor が属性を受け入れるには、属性名にアンダースコアを使用する必要があることに注意してください。

于 2013-04-18T11:07:50.853 に答える
52

あなたがしなければならないことは次のとおりです。

Application_Start()in内に次のコードを追加しますGlobal.asax

 ClientDataTypeModelValidatorProvider.ResourceClassKey = "Messages";
 DefaultModelBinder.ResourceClassKey = "Messages";

VS で ASP.NET MVC プロジェクトを右クリックします。を選択しAdd => Add ASP.NET Folder => App_GlobalResourcesます。

そのフォルダにという.resxファイルを追加します。Messages.resx

.resx次の文字列リソースをファイルに追加します。

FieldMustBeDate        The field {0} must be a date.
FieldMustBeNumeric     The field {0} must be a number.
PropertyValueInvalid   The value '{0}' is not valid for {1}.
PropertyValueRequired  A value is required.

FieldMustBeNumeric必要に応じて値を変更してください... :)

あなたは終わった。


詳細については、この投稿を確認してください。

ASP.NET MVC および Web フォームでの既定のエラー メッセージのローカライズ

于 2013-08-22T23:50:34.637 に答える
39

これは簡単なことではありません。既定のメッセージは埋め込みリソースとしてSystem.Web.Mvcアセンブリに格納され、取得するメソッドは内部のシールされた内部クラス ( System.Web.Mvc.ClientDataTypeModelValidatorProvider+NumericModelValidator.MakeErrorString) のプライベート静的メソッドです。これは、Microsoft のコーディング担当者がトップ シークレットを隠しているかのようです :-)

考えられる解決策について説明している次のブログ投稿をご覧ください。基本的に、既存のClientDataTypeModelValidatorProviderをカスタムのものに置き換える必要があります。

必要なハードコアコーディングが気に入らない場合は、ビューモデル内のこの整数値を文字列に置き換えて、解析を実行し、カスタムエラーメッセージを提供するカスタム検証属性を設定することもできます (これはローカライズすることもできます)。

于 2011-01-28T18:27:33.487 に答える
23

これを回避する別の方法として、RegularExpression 属性を適用して無効なエントリをキャッチし、そこにメッセージを設定しました。

[RegularExpression(@"[0-9]*$", ErrorMessage = "Please enter a valid number ")]

これは少しハックですが、少なくとも私の特定の状況では、他のソリューションが提示する複雑さよりも好ましいように思えました。

編集:これは MVC3 でうまく機能しましたが、MVC4+ にはもっと良い解決策があるようです。

于 2011-10-11T17:09:38.730 に答える
11

私が持っているMVC 3に関するこの本から。あなたがしなければならないのはこれだけです:

public class ClientNumberValidatorProvider : ClientDataTypeModelValidatorProvider 
{ 
   public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, 
                                                          ControllerContext context) 
   { 
       bool isNumericField = base.GetValidators(metadata, context).Any(); 
       if (isNumericField) 
           yield return new ClientSideNumberValidator(metadata, context); 
   } 
} 

public class ClientSideNumberValidator : ModelValidator 
{ 
  public ClientSideNumberValidator(ModelMetadata metadata,  
      ControllerContext controllerContext) : base(metadata, controllerContext) { } 

  public override IEnumerable<ModelValidationResult> Validate(object container) 
  { 
     yield break; // Do nothing for server-side validation 
  } 

  public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
  { 
     yield return new ModelClientValidationRule { 
        ValidationType = "number", 
        ErrorMessage = string.Format(CultureInfo.CurrentCulture,  
                                     ValidationMessages.MustBeNumber,  
                                     Metadata.GetDisplayName()) 
        }; 
  } 
} 

protected void Application_Start() 
{ 
    // Leave the rest of this method unchanged 

    var existingProvider = ModelValidatorProviders.Providers 
        .Single(x => x is ClientDataTypeModelValidatorProvider); 
    ModelValidatorProviders.Providers.Remove(existingProvider); 
    ModelValidatorProviders.Providers.Add(new ClientNumberValidatorProvider()); 
} 

ErrorMessage がどのように生成されるかに注意してください。現在のカルチャを指定すると、ローカライズされたメッセージが ValidationMessages (ここではカルチャ固有) .resx リソース ファイルから抽出されます。それが必要ない場合は、独自のメッセージに置き換えてください。

于 2011-06-19T21:47:17.520 に答える
7

MVC3 ソースを変更せずにメッセージ クライアント側を変更する別のソリューションを次に示します。このブログ投稿の詳細:

https://greenicicle.wordpress.com/2011/02/28/fixing-non-localizable-validation-messages-with-javascript/

つまり、jQuery 検証がロードされた後に次のスクリプトと適切なローカリゼーション ファイルを含める必要があります。

(function ($) {
    // Walk through the adapters that connect unobstrusive validation to jQuery.validate.
    // Look for all adapters that perform number validation
    $.each($.validator.unobtrusive.adapters, function () {
        if (this.name === "number") {
            // Get the method called by the adapter, and replace it with one 
            // that changes the message to the jQuery.validate default message
            // that can be globalized. If that string contains a {0} placeholder, 
            // it is replaced by the field name.
            var baseAdapt = this.adapt;
            this.adapt = function (options) {
                var fieldName = new RegExp("The field (.+) must be a number").exec(options.message)[1];
                options.message = $.validator.format($.validator.messages.number, fieldName);
                baseAdapt(options);
            };
        }
    });
} (jQuery));
于 2011-06-15T14:01:30.920 に答える
5

クラスを、キーを含むグローバル リソースの名前にResourceKey設定して、数値の MVC 検証エラー メッセージをカスタム メッセージに置き換えることができます。また、日付検証エラー メッセージのキーは です。ClientDataTypeModelValidatorProviderFieldMustBeNumericFieldMustBeDate

ClientDataTypeModelValidatorProvider.ResourceKey="MyResources"; // MyResource is my global resource

ファイルをプロジェクトに追加する方法の詳細については、こちらを参照してください。MyResources.resx

于 2013-02-02T19:32:17.770 に答える
3

これもチェックしてください:

ASP.NET MVC 3 での検証の完全ガイド - パート 2

記事の主要部分は次のとおりです (コピペ)。

クライアントとサーバーの両方で機能する完全に機能するカスタム バリデータを作成するには、4 つの異なる部分があります。まずValidationAttribute、サーバー側の検証ロジックをサブクラス化して追加します。次に、属性に実装IClientValidatableして、HTML5data-*属性をクライアントに渡すことができるようにします。3 番目に、クライアントで検証を実行するカスタム JavaScript 関数を作成します。最後に、HTML5 属性をカスタム関数が理解できる形式に変換するアダプターを作成します。これは大変な作業のように思えますが、一度始めると、比較的簡単であることがわかります。

ValidationAttribute のサブクラス化

この例では、あるプロパティの値が別のプロパティの値と等しくないことを単純にチェックする NotEqualTo バリデータを記述します。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class NotEqualToAttribute : ValidationAttribute
{
    private const string DefaultErrorMessage = "{0} cannot be the same as {1}.";

    public string OtherProperty { get; private set; }

    public NotEqualToAttribute(string otherProperty)
        : base(DefaultErrorMessage)
    {
        if (string.IsNullOrEmpty(otherProperty))
        {
            throw new ArgumentNullException("otherProperty");
        }

        OtherProperty = otherProperty;
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format(ErrorMessageString, name, OtherProperty);
    }

    protected override ValidationResult IsValid(object value, 
        ValidationContext validationContext)
    {
        if (value != null)
        {
            var otherProperty = validationContext.ObjectInstance.GetType()
                .GetProperty(OtherProperty);

            var otherPropertyValue = otherProperty
                .GetValue(validationContext.ObjectInstance, null);

            if (value.Equals(otherPropertyValue))
            {
                return new ValidationResult(
                    FormatErrorMessage(validationContext.DisplayName));
            }
        }
    return ValidationResult.Success;
    }        
}

RegisterModel の password プロパティに新しい属性を追加し、アプリケーションを実行します。

[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[NotEqualTo("UserName")]
public string Password { get; set; }
...

IClientValidatable の実装

ASP.NET MVC 2 には、クライアント側の検証を追加するメカニズムがありましたが、あまりきれいではありませんでした。ありがたいことに、MVC 3 では状況が改善され、プロセスはかなり簡単になりました。ありがたいことに、以前のバージョンの as を変更する必要はありません。Global.asax

最初のステップは、カスタム検証属性が IClientValidatable を実装することです。これは単純な 1 つのメソッド インターフェイスです。

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata,
    ControllerContext context)
{
    var clientValidationRule = new ModelClientValidationRule()
    {
        ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
        ValidationType = "notequalto"
    };

    clientValidationRule.ValidationParameters.Add("otherproperty", OtherProperty);

    return new[] { clientValidationRule };
}

ここでアプリケーションを実行してソースを表示すると、パスワード入力 html にnotequaltoデータ属性が含まれていることがわかります。

<div class="editor-field">
    <input data-val="true" data-val-notequalto="Password cannot be the same as UserName." 
    data-val-notequalto-otherproperty="UserName" 
    data-val-regex="Weak password detected." 
    data-val-regex-pattern="^(?!password$)(?!12345$).*" 
    data-val-required="The Password field is required." 
    id="Password" name="Password" type="password" />
    <span class="hint">Enter your password here</span>
    <span class="field-validation-valid" data-valmsg-for="Password" 
    data-valmsg-replace="true"></span>
</div>

カスタム jQuery 検証関数の作成

このコードはすべて、別の JavaScript ファイルに配置することをお勧めします。

(function ($) {
    $.validator.addMethod("notequalto", function (value, element, params) {
        if (!this.optional(element)) {
            var otherProp = $('#' + params);
            return (otherProp.val() != 
        }
    return true;
});

$.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty");

}(jQuery));

検証要件によっては、検証自体に必要なコードが jquery.validate ライブラリに既に含まれている場合があります。jquery.validate には、実装されていない、またはデータ注釈にマップされていないバリデーターがたくさんあるため、これらがニーズを満たす場合、javascript で記述する必要があるのは、アダプターまたは組み込みアダプターへの呼び出しだけです。わずか 1 行であること。jquery.validate.jsの内部を調べて、利用可能なものを見つけてください。

既存の jquery.validate.unobtrusive アダプターの使用

アダプターの仕事は、フォーム要素の HTML5data-*属性を読み取り、このデータを jquery.validate とカスタム検証関数が理解できるフォームに変換することです。ただし、すべての作業を自分で行う必要はありません。多くの場合、組み込みアダプターを呼び出すことができます。jquery.validate.unobtrusive は、ほとんどの状況で使用できる 3 つの組み込みアダプターを宣言します。これらは:

jQuery.validator.unobtrusive.adapters.addBool - used when your validator does not need any additional data.
jQuery.validator.unobtrusive.adapters.addSingleVal - used when your validator takes in one piece of additional data.
jQuery.validator.unobtrusive.adapters.addMinMax - used when your validator deals with minimum and maximum values such as range or string length.

バリデーターがこれらのカテゴリーのいずれにも当てはまらない場合は、jQuery.validator.unobtrusive.adapters.addメソッドを使用して独自のアダプターを作成する必要があります。これは思ったほど難しくはありません。この記事の後半で例を示します。

メソッドを使用してaddSingleVal、アダプタの名前と渡したい単一の値の名前を渡します。検証関数の名前がアダプターと異なる場合は、3 番目のパラメーター ( ruleName)を渡すことができます。

jQuery.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty", "mynotequaltofunction");

この時点で、カスタム バリデータは完成です。

理解を深めるために、より詳細な説明とより複雑な例を示す記事自体を参照してください。

HTH。

于 2015-02-03T10:48:20.677 に答える
1

または、単にこれを行うことができます。

@Html.ValidationMessageFor(m => m.PercentChange, "Custom Message: Input value must be a number"), new { @style = "display:none" })

お役に立てれば。

于 2014-07-26T22:27:49.907 に答える
1

私はこれを行った後、正規表現を使用しました:

$(document).ready(function () {
    $.validator.methods.number = function (e) {
        return true;
    };
});


[RegularExpression(@"^[0-9\.]*$", ErrorMessage = "Invalid Amount")]
public decimal? Amount { get; set; }
于 2012-12-19T12:22:03.807 に答える