1

ASP.Net MVC3 で、過去 2 日間、クライアント側のカスタム検証を機能させようとしています。hereherehere、およびhereの例に従いましたが、実行できません。誰かが私の(現在の)コードを見て、エラーが発生した場合はお知らせください。

Web.Config には ClientValidationEnabled と UnobtrusiveJavaScriptEnabled の両方が true に設定されています

_Layout.cshtml は次のようにファイルを参照します

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

サーバー側の検証クラスは次のように定義されます

public class DateFormatValidation : ValidationAttribute, IClientValidatable
{
    public string ValidDateFormat { get; set; }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var modelClientValidationRule = new ModelClientValidationRule
        {
            ValidationType = "validatedate",  // the name of the validation rule as specified in DateFormatValidator.js
            ErrorMessage = LocalisationStrings.InvalidDateFormat
        };

        modelClientValidationRule.ValidationParameters["name"] = ValidDateFormat;
        yield return modelClientValidationRule;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {            
        var dateString = (string) value;
        if(String.IsNullOrEmpty(dateString))
        {
            return ValidationResult.Success;
        }

        // if we can't convert to a date based on the current culture then we will get a null back from the ConvertLocalDateFormatToISO extension method
        if(String.IsNullOrEmpty(dateString.ConvertLocalDateFormatToISO()))
        {
            return new ValidationResult(LocalisationStrings.InvalidDateFormat);
        }
        return ValidationResult.Success;
    }
}

ビューモデルは次のように定義されます

public class SearchViewModel : ElectronicDocument
{

    #region Properties

    [DateFormatValidation(ValidDateFormat="validatedate")] // addig the paramter to the attribute is just a test to get this to work
    public string DueDateFrom
    {
        get;            
        set;             
    }

    [DateFormatValidation]
    public string DueDateTo
    {
        get;
        set;             
    }

クライアント側の検証スクリプトは次のとおりです。

(function ($) {
$.validator.addMethod('validatedateformat', function (value, element, param) {
    if (!value) { return true; }
    try {
        var isValidDate = false;
        /* - CheckDateValidFormat is available from the base controller class  */
        $.get('CheckDateValidFormat(' + value +')',
            function (data) {                  
                isValidDate = data;
            });
        if (isValidDate) {
            return true;
        }
        return false;
    }
    catch (e) {
        return false;
    }
});

$.validator.unobtrusive.adapters.add('validatedate', ['name'], function (options) {
    options.rules["validatedateformat"] = options.params.name;
    if (options.message) options.messages["validatedateformat"] = options.message;
});

} (jQuery));

最終的にビューは次のようになります。

<td style="font-size:10px; white-space:nowrap; color: #666">               
           @Html.TextBox("DocumentDateFrom", Model.DocumentDateFrom, new { @class = "date", style = "width:90px;" })
        to @Html.TextBox("DocumentDateTo", Model.DocumentDateTo, new { @class = "date", style = "width:90px;" })</td>
4

1 に答える 1

2

を含めてjquery-1.8.11.min.jsいます。最新バージョンは 1.7.2 であるため、このバージョンの jQuery は存在しません。

jQuery UI (最新バージョン 1.8.20)が含まれていると思いますが、それはjQueryだと思います。正しいファイルを使用していることを確認してください。

于 2012-05-28T15:07:22.693 に答える