Я создал собственный атрибут проверки, который работает на стороне сервера (после отправки формы), но я не могу заставить валидацию работать на стороне клиента.jQuery Ненавязчивая проверка на стороне клиента настраиваемого атрибута
Обычай атрибут:
public class ReasonableAttribute : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
return Approval.IsNumberReasonable(value.ToString());
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
ModelClientValidationRule rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
rule.ValidationType = "reasonable";
yield return rule;
}
}
IsNumberReasonable()
функция просто делает некоторые проверки на входе полей, чтобы убедиться, что они вошли бы разумно быть номер утверждения (например, не пусто, или «Неизвестный» или что-то например), возвращая bool true/false
. затем
Моя модель содержит:
[Display(Name = "Approval Number"]
[Reasonable(ErrorMessage = "Please enter a reasonable {0}")]
public String ApprovalNumber { get; set; }
Вид и содержит:
@Html.LabelFor(model => model.ApprovalNumber, new { @class = "control-label col-md-3" })
<div class="col-md-9 append field">
@Html.TextBoxFor(model => model.ApprovalNumber, new { @class = "input text" })
@Html.ValidationMessageFor(model => model.ApprovalNumber)
</div>
в JavaScript Я попытался добавить:
$.validator.unobtrusive.adapters.addBool("reasonable", "required");
// OR
$.validator.unobtrusive.adapters.add("reasonable");
и (за пределами документа. готово)
(function ($) {
$.validator.addMethod('reasonable', function (value, element, params) {
return value != '';
}, 'Clientside Should Not Postback');
$.validator.unobtrusive.adapters.addBool('reasonable');
})(jQuery);
в различных комбинациях, но не смог заставить его работать.
Я получил
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
включены в представлении.
Когда форма отправлена, проверка на стороне клиента работает для других полей (требуемых и т. Д.), Но сообщение проверки рядом с номером утверждения никогда не появляется/не выполняет мою собственную проверку.
Любые указатели в правильном направлении оцениваются. спасибо.
У меня также есть
<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
</configuration>
Уже в файле Web.config.
Edit 2: согласно сообщению chenZ в: HTML, для поля ввода:
<input class="input text valid" data-val="true" data-val-reasonable="Please enter a reasonable Approval Number" data-val-required="Approval Number is Required." id="ApprovalNumber" name="ApprovalNumber" type="text" value="">
Пытался обновить дно моей точки зрения с:
<script src="~/Scripts/jquery.validate.js"></script>
<script type="text/javascript">
(function ($) {
$.validator.addMethod('reasonable', function (value, element, params) {
return value != '';
}, 'Clientside Should Not Postback');
})(jQuery);
</script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/Create.js"></script>
где конец jquery.validate.unobtrusive.js
в настоящее время содержит:
$(function() {
$.validator.unobtrusive.adapters.addBool('reasonable');
$("#formID").removeData("unobtrusiveValidation").removeData("validator");
$jQval.unobtrusive.parse(document);
});
}(jQuery));
и create.js
содержат:
$.validator.unobtrusive.adapters.addBool("mandatory", "required"); // another custom attribute for checkbox validation
var v = $("#formID").validate({
errorClass: "warning",
onkeyup: false,
onblur: false,
});
переменной v
используются далее вниз для кнопки отправки:
$("#SubmitButton").click(function() {
if (v.form()) {
// The form passed validation so continue..
} else {
// Validation failed, do something else..
}
});
Я некоторое дальнейшее тестирование ансом это, кажется, что-то делать с:
(function ($) {
$.validator.addMethod('reasonable', function (value, element, params) {
return value != '';
}, 'Clientside Should Not Postback');
})(jQuery);
, когда я меняю его на:
(function ($) {
$.validator.addMethod('reasonable', function (value, element, params) {
return value != 'unknown';
}, 'Clientside Should Not Postback');
})(jQuery);
это работает, но только если я напечатаю «неизвестный» в поле ввода, все остальное пройдет. Аналогично, если я положил return value != 'jhdsfkhsdkfj';
, он проверяется только при вводе jhdsfkhsdkfj.
поэтому кажется, что он использует это как правило? вместо моей серверной функции IsNumberReasonable()
.
Надеюсь, что это поможет в поиске и устранении неисправностей.
is $.validator.addMethod выше ref jq.validate.unobtrusive? – chenZ
не на 100% уверен, что вы подразумеваете под этим .. Да? '$ .validator.addMethod' и' $ .validator.messages' были использованы в другом месте JS, поэтому я предположил, что это был синтаксис для этого. – Jake