我在让客户端验证在 ASP.NET Core MVC 中工作时遇到问题。我已经用谷歌搜索并应用了这里的示例(http://www.discuzfeed.com/code/lotooslo-mvc-6-client-side-validation-for-custom-attribute.html http://www.discuzfeed.com/code/lotooslo-mvc-6-client-side-validation-for-custom-attribute.html)但没有运气。
这是我的代码
属性
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public sealed class CannotBeRedAttribute : ValidationAttribute, IClientModelValidator
{
public override bool IsValid(object value)
{
var message = value as string;
return false;
//return message?.ToLower() == "red";
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ClientModelValidationContext context)
{
yield return new ModelClientValidationRule(
"cannotbered",
FormatErrorMessage(ErrorMessage));
}
}
查看模型
[CannotBeRed(ErrorMessage = "Not red!")]
public string SelectedCompanyIds { get; set; }
View
<input type="hidden" name="test" class="form-control" id="selectCompanyIdControl" data-bind="value: SelectedReportCompanyIds" asp- for="SelectedCompanyIds" />
@<script type="text/javascript">
require(['jquery', 'knockout-es5', 'jquery-validation', 'jquery-validation-unobtrusive', 'pubsubjs', 'ReportEditViewModel'], function(jquery, knockout, jQueryVal, jQueryValUnobtrusive, pubsub, vm) {
jquery(document).ready(function () {
jquery.validator.addMethod("cannotbered",
function (value, element, parameters) {
alert("READ");
return value.toLowerCase() !== "red";
});
jquery.validator.unobtrusive.adapters.add('cannotbered', [], function (options) {
alert("ADAPATER");
options.rules.cannotbered = {};
options.messages['cannotbered'] = options.message;
});
忽略括号在视图中未正确闭合的事实,还有其他 JS 部分与淘汰赛有关,由于不相关而未在此处复制。
The GetClientValidationRules
方法被命中,但 JS 中的警报却没有。仅供参考,当在 chrome 或 IE 中运行开发人员工具时,我可以看到 jquery 验证和不显眼的库已加载,并且没有控制台错误。输入框上的验证标签似乎没问题......
<input type="hidden" name="test" class="form-control" id="selectCompanyIdControl" data-bind="value: SelectedReportCompanyIds" data-val="true" data-val-cannotbered="Not red!" value="" />
所以我想我只是错过了一步,但无法想象它可能是什么。有什么指点吗?