Я пытаюсь получить проверку на стороне клиента, работающую в ASP/NET MVC4, но без атрибутов на стороне сервера и аннотаций данных. Я хочу сделать это строго с помощью плагина jQuery Validation на мой взгляд. Вот мой HTML:
<form id="mainForm" method="post" action="/Department/Save">
@Html.ValidationSummary("Please correct the errors")
<label>Department Name:</label><input type="text" id="DepartmentName" name="DepartmentName"/>
@Html.ValidationMessageFor(model => model.DepartmentName)
<br />
<label>Department Name Fr:</label><input type="text" id="DepartmentNameFr" name="DepartmentNameFr"/>
<input type="submit" id="btnSave" value="Save" />
Вот мой сценарий jQuery:
$("#formWeek").validate({
highlight: function (element, errorClass) {
$(element).add($(element).parent()).addClass("input-validation-error");
},
unhighlight: function (element, errorClass) {
$(element).add($(element).parent()).removeClass("input-validation-error");
}
});
$('#DateRangeCriteriaWeek').rules('add', {
required: true,
regex:"(201[3-9]|20[2-9][0-9])-(0[1-9]|[1-4][0-9]|5[0-3])",
messages: {
required: "Date Range Criteria is required.",
regex: "Date Range Criteria format is invalid."
}
});
В начале я даже не получал сообщений об ошибках, я просто получал красные текстовые поля, когда я оставил пустые записи (когда я нажал кнопку отправки). Первоначально я думал, что jQuery будет отображать сообщения об ошибках автоматически, но это не так. Однако, когда я добавил помощника Html.ValidationSummary, неожиданно появились сообщения об ошибках.
Затем я заметил, что сообщения об ошибках были сообщениями по умолчанию, а не таковыми, которые я определил выше. Я понял, что для отображения пользовательских сообщений мне пришлось использовать метод правил, как показано выше. Но теперь сообщения не исчезают, когда пользователь исправляет ошибки.
Вот рендеринг HTML:
<form id="formWeek" method="post" data-ajax-update="#ProductsDivWeek" data-ajax-success="process('Week')" data-ajax-mode="replace" data-ajax-method="Post" data-ajax="true" action="/Dashboard/Products?Length=9" novalidate="novalidate">
<div>
<div class="validation-summary-valid" data-valmsg-summary="true">
<ul>
<li style="display:none"></li>
</ul>
</div>
</div>
<table>
<tbody>
<tr>
<td>Date : </td>
<td>
<input id="DateRangeFilterWeek" type="hidden" value="FiscalWeek" name="DateRangeFilter">
<span class="ui-helper-hidden-accessible" role="status" aria-live="polite"></span>
<input id="DateRangeCriteriaWeek" class="ui-autocomplete-input" type="text" value="21/09/2013" name="DateRangeCriteria" data-val-required="Date Range Criteria is required." data-val="true" autocomplete="off">
</td>
<td>
<input id="btnApplyWeek" type="submit" title="Apply" value="Apply" name="btnApply">
</td>
</tr>
</tbody>
</table>
В regex
jQuery Validate такого метода или правила, называемого regex
. Вам нужно будет создать этот настраиваемый метод, используя встроенный метод .addMethod()
.
jQuery.validator.addMethod("regex", function (value, element, param) {
var regex = new RegExp(param);
return regex.test(value);
}, "");
$('#DateRangeCriteriaWeek').rules('add', {
required: true,
regex: "^(201[3-9]|20[2-9][0-9])-(0[1-9]|[1-4][0-9]|5[0-3])",
messages: {
required: "Date Range Criteria is required.",
regex: "Date Range Criteria format is invalid."
}
});
См. Документацию для addMethod
: http://jqueryvalidation.org/jQuery.validator.addMethod/
Рабочий ДЕМО: http://jsfiddle.net/jrLSF/
Кроме того, поскольку вы не используете unobtrusive.validate.js
...
1) Вы определили свои правила и сообщения в другом месте, поэтому AFAIK вам не нужны какие-либо атрибуты data-val-
.
2) Удалите атрибуты data-ajax-
из <form>
и поместите любой .ajax()
в функцию submitHandler
.
submitHandler: function () {
// ajax goes here;
return false;
}