0

カスタム データ属性 JQuery 控えめなアダプターからエラー メッセージを取得しようとしていますが、エラー メッセージを変数に抽出できないようです。私の検証メッセージは次のように返されます。

警告: 画像にメッセージが定義されていません

コードは次のとおりです。

$(document).ready(function () {
var errorMessage;
$.validator.unobtrusive.adapters.add(
    'filesize', ['maxsize'], function (options) {
        options.rules['filesize'] = options.params;

        if (options.message) {
            options.message['filesize'] = options.message;             

            $.each(options, function (key, val) {
                console.log("Key: " + key + " | Value: " + val);
                if (key === "message") {
                    errorMessage = val;
                }
            });

        }
    });

$.validator.addMethod('filesize', function (value, element, params) {
    if (element.files.length < 1) {
        // No files selected
        return true;
    }

    if (!element.files || !element.files[0].size) {
        // This browser doesn't support the HTML5 API
        return true;
    }

    return element.files[0].size < params.maxsize;
}, errorMessage); // This is where the variable errorMessage is used
});

また、options.messages (複数形) の正しい JQuery 構文を使用して $.each ブロック全体を除外すると、Firebug を開くと Firefox がクラッシュしますか?

4

2 に答える 2

1

通常、ビュー モデルに記述したカスタム検証属性でエラー メッセージを指定します。

public class MyViewModel
{
    [Required]
    [MaxFileSize(8388608, ErrorMessage = "Maximum allowed file size is {0} bytes")]
    public HttpPostedFileBase File { get; set; }
}

そして、カスタム検証属性を持っています:

public class MaxFileSizeAttribute : ValidationAttribute, IClientValidatable
{
    private readonly int _maxFileSize;
    public MaxFileSizeAttribute(int maxFileSize)
    {
        _maxFileSize = maxFileSize;
    }

    public override bool IsValid(object value)
    {
        var file = value as HttpPostedFileBase;
        if (file == null)
        {
            return false;
        }
        return file.ContentLength <= _maxFileSize;
    }

    public override string FormatErrorMessage(string name)
    {
        return base.FormatErrorMessage(_maxFileSize.ToString());
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(_maxFileSize.ToString()),
            ValidationType = "filesize"
        };
        rule.ValidationParameters["maxsize"] = _maxFileSize;
        yield return rule;
    }
}

そして目立たないアダプター:

jQuery.validator.unobtrusive.adapters.add(
    'filesize', [ 'maxsize' ], function (options) {
        options.rules['filesize'] = options.params;
        if (options.message) {
            options.messages['filesize'] = options.message;
        }
    }
);

jQuery.validator.addMethod('filesize', function (value, element, params) {
    if (element.files.length < 1) {
        // No files selected
        return true;
    }

    if (!element.files || !element.files[0].size) {
        // This browser doesn't support the HTML5 API
        return true;
    }

    return element.files[0].size < params.maxsize;
}, '');
于 2012-08-15T17:20:32.920 に答える
0

$.each を使用してキーを文字列と比較するには、単純に行うことができます

var myObj = {'message1' : 1, 'message2' : 2};
$.each(​myObj, function(key){
     if(key == 'message1'){
         alert('they match!');                     
     }                                
});​
于 2012-08-15T17:26:08.297 に答える