関連:パラメーターを使用したASP.NETMVC3クライアント側の検証
相対的な日付を確認できるカスタム検証属性を作成しました(例:Today以下のモデル値)。
GetClientValidationRules
バリデーターはメソッドを正しく実装し、ビューで出力されたHTML5は私には正しいように見えます。
<div class="editor-label">
<label for="Date">Date</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-date="The field Date must be a date." data-val-relativedate="Date must be less than or equal to 12/04/2012" data-val-relativedate-referencedate="12/04/2012 00:00:00" data-val-relativedate-relativityoperator="lessThanOrEqual" data-val-required="The Date field is required." id="Date" name="Date" type="date" value="" />
<span class="field-validation-valid" data-valmsg-for="Date" data-valmsg-replace="true"></span>
</div>
次のステップは、カスタムjQueryUnobtrusiveValidatorアダプターとメソッドを定義することでした。
// Validation Method: Relative Date
// Note: method name value does NOT need to match the HTML5 metadata built by the server model annotation attribute.
$.validator.addMethod("validateRelativeDate", function (value, element, params) {
// "element" is the actual HTML element we are validating, and is unneeded here.
// "value" is the value of the HTML element
var toValidate = DateUtilities.convert(value);
// "params" is a JSON collection of those values provided by the adapter.
var referenceDate = params["referencedate"];
var relativityOperator = params["relativityoperator"];
if (relativityOperator != "lessThan" && relativityOperator != "lessThanOrEqual" || relativityOperator != "greaterThan" && relativityOperator != "greaterThanOrEqual")
return false; // "Invalid relativity operator (ex. '<', '<=', '>', or '>=').");
var toReference = referenceDate == null ? new Date() : referenceDate;
var relativity = DateUtilities.compare(toValidate, toReference);
switch(relativityOperator) {
case "lessThan":
if (relativity >= 0) return false; //"Date must be lesser than " + toReference);
break;
case "lessThanOrEqual":
if (relativity > 0) return false; //"Date must be less than or equal to " + toReference);
break;
case "greaterThan":
if (relativity <= 0) return false; //"Date must be greater than " + toReference);
break;
case "greaterThanOrEqual":
if (relativity < 0) return false; //"Date must be greater than or equal to " + toReference);
break;
}
return true;
});
// note: adapter name must match HTML metadata built by the server model annotation attribute
$.validator.unobtrusive.adapters.add("relativedate", ["referencedate", "relativityoperator"], function (options) {
options.rules["relativedate"] = options.params;
options.messages["relativedate"] = options.message;
});
症状
日付の検証が壊れています。必須は正常に動作しているようです。しかし、このフィールドに値を入力すると、Date型バリデーターがトリガーされ、「フィールドDateは日付である必要があります」というメッセージが生成されます。これは、入力されたすべての日付値に対して発生します。
質問
(1)機能せず、(2)日付型の検証を妨害するという私の検証ルールの何が問題になっていますか?