3

ValidationAttribute から派生するカスタム バリデータを作成しました。私の理解は、クライアント側スクリプトが (jquery.validate を使用して) 自動的に検証するのに十分なメタデータを生成することです。カスタムバリデーターはサーバー側で正常に動作しています。ただし、クライアント側ではエラー メッセージは表示されません。(「StringLength」などの他のデフォルトのバリデーターは、クライアント側でも問題なく動作しています。) どうすれば修正できますか?

public class Person
{
    [Required(ErrorMessage = "First name required")]
    public string FirstName { get; set; }

    [CustomStartLetterMatch("FirstName")]
    [StringLength(5,ErrorMessage = "Must be under 5 characters")]
    public string LastName { get; set; }

    [Range(18,50,ErrorMessage="Must be between 18 and 50")]
    public int Age { get; set; }


}


public sealed class CustomStartLetterMatch : ValidationAttribute
{

    private const string _defaultErrorMessage = " First letter of '{0}' must be same as first letetr of '{1}'";
    private string _basePropertyName;

    public CustomStartLetterMatch(string basePropertyName)
        : base(_defaultErrorMessage)
    {
        _basePropertyName = basePropertyName;
    }


    //Override FormatErrorMessage Method
    public override string FormatErrorMessage(string name)
    {
        return string.Format(_defaultErrorMessage, name, _basePropertyName);
    }


    //Override IsValid
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        //Get PropertyInfo Object
        var basePropertyInfo = validationContext.ObjectType.GetProperty(_basePropertyName);
        var baseValue = (string)basePropertyInfo.GetValue(validationContext.ObjectInstance, null);
        var currentValue = (string)value;


        string firstLetterBaseValue = baseValue.Substring(0, 1);
        string firstLetterCurrentValue = currentValue.Substring(0, 1);

        //Comparision
        if (!string.Equals(firstLetterBaseValue, firstLetterCurrentValue))
        {
            var message = FormatErrorMessage(validationContext.DisplayName);
            return new ValidationResult(message);
        }

        //Default return - This means there were no validation error
        return null;
    }

}

見る

@model MyValidationTEST.Person

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript">  </script>

@*UnObtrusive*@
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>




@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Person</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.FirstName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.FirstName)
        @Html.ValidationMessageFor(model => model.FirstName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.LastName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.LastName)
        @Html.ValidationMessageFor(model => model.LastName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Age)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Age)
        @Html.ValidationMessageFor(model => model.Age)
    </div>



    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>

読む:

  1. MVC3 の IValidatableObject - クライアント側の検証

  2. ASP.NET MVC3 では、非常に似ているがわずかに異なるビューモデルでどのように DRY を維持していますか?

  3. http://odetocode.com/Blogs/scott/archive/2011/02/22/custom-data-annotation-validator-part-ii-client-code.aspx

  4. http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html

  5. パラメーターを使用した ASP.NET MVC 3 クライアント側の検証

  6. カスタム ValidationAttribute をクライアント側で 'data-val-xx' 属性としてレンダリングするにはどうすればよいですか?

  7. ASP.NET-MVC3 の「自己検証モデル」でのクライアント側検証

4

1 に答える 1

5

私の理解は、クライアント側のスクリプトが (jquery.validate を使用して) 自動的に検証するのに十分なメタデータを生成することです。

あなたの理解は間違っています。クライアント検証を生成するのに十分なメタデータがあるとは期待できません。このIsValid方法では、絶対に何でもできます。アンマネージ C++ ライブラリを呼び出して検証を実行することもできます。ASP.NET MVC 3 がこれをクライアントに反映するとは期待できません。

このようなカスタム検証ロジックのクライアント検証を有効にする場合は、IClientValidatableを実装し、カスタム アダプターを追加する必要があります。このアダプターでは、サーバーで行ったのと同じロジックを再実装する必要がありますが、今回は JavaScript を使用します。

ここに一例があります。そして、ここに別のものがあります。

クライアント側の検証が Required などのいくつかの単純なルールで正常に機能することがわかるように、実際の検証を開始したら、自分で実装する必要があります。

于 2012-02-19T10:48:13.650 に答える