0

構成ファイルから文字列の長さの値を読み取るカスタム属性を作成しました。ajax get を使用してロードされる部分ビューで使用しています。

カスタム属性のコードは次のとおりです。

public class ConfigMaxLengthAttribute : StringLengthAttribute,IClientValidatable
    {
        private readonly int _maxLength;

        public ConfigMaxLengthAttribute(string key)
            : base(int.Parse(ConfigurationManager.AppSettings[key]))
        {
            _maxLength = int.Parse(ConfigurationManager.AppSettings[key]);
        }

        public override bool IsValid(object value)
        {
            var strValue = value as string;
            if (!string.IsNullOrEmpty(strValue))
            {
                var len = strValue.Length;
                return len <= _maxLength;
            }
            return true;
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            yield return new ModelClientValidationRule
               {
                   ErrorMessage = "Custom Error Message",
                   ValidationType = "stringmaxlength"
               };
        }
    }

JS ファイルには、次のコードを含めました。

/// <reference path="jquery-1.7.2.js" />
/// <reference path="jquery.validate.js" />
/// <reference path="jquery.validate.unobtrusive.js" />
jQuery.validator.addMethod('greaterThan', function (value, element, params) {
    return value.length>200;
}, '');

jQuery.validator.unobtrusive.adapters.add('stringmaxlength', {}, function (options) {
        options.rules['greaterThan'] = true;
        options.messages['greaterThan'] = options.messages;
    });

これにより、html のフィールドに対して次のマークアップが生成されます。

<textarea cols="28" data-val="true" data-val-stringmaxlength="Notes entered cannot be more than 200 characters." id="UserNote" name="UserNote" rows="2" >
</textarea>

この JS ファイルをビューに含めました。私のweb.configファイルでは、クライアント側の検証が有効になっています..

このカスタム属性を除いて、データ注釈を使用したすべてのクライアント側の検証が機能しています..

先に進む方法がわかりません。助けてください...

4

1 に答える 1

0

Ajax 経由でパーシャルをロードするには、HTML 内の目立たない検証属性が検証フレームワークによって理解されるように、新しいコンテンツを再解析する必要があります。jquery validate を使っていると思います。

そのため、フォームを含むコンテンツをコンテナー div にロードしていた場合は、次のようになります。

var form = $(newContentContainerDiv).find("form");
$.validator.unobtrusive.parse(form);

...これにより、新しいフォームで検証属性が再解析されます。

これは、検証 f/w が認識しないため、Ajax を介して新しいコンテンツをロードする場合の要件です。

属性が確実に機能していることをテストしたい場合は、パーシャルを通常のビューに含めるだけで (つまり、Ajax を使用しないでください)、属性が機能する場合は、追加の作業なしで検証する必要があります。

于 2012-12-07T08:19:00.773 に答える