【发布时间】:2017-05-08 12:12:40
【问题描述】:
如果另一个属性具有指定的值,我正在编写一个自定义属性以要求视图模型中的一个属性。
我用这篇文章作为参考:RequiredIf Conditional Validation Attribute
但在 IClientModelValidator 的 .NET Core 修订版中遇到了问题。具体来说,服务器端验证按预期工作,ModelState.IsValid 返回 false,并且 ModelState 错误包含我的自定义错误代码。在验证器的不同版本之间进行翻译时,我觉得我遗漏了一些东西。
旧的(有效的)解决方案具有以下特点:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,
ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = ErrorMessageString,
ValidationType = "requiredif",
};
rule.ValidationParameters["dependentproperty"] =
(context as ViewContext).ViewData.TemplateInfo.GetFullHtmlFieldId(PropertyName);
rule.ValidationParameters["desiredvalue"] = DesiredValue is bool
? DesiredValue.ToString().ToLower()
: DesiredValue;
yield return rule;
}
基于此处概述的对 IClientModelValidator 的更改:https://github.com/aspnet/Announcements/issues/179 我编写了以下方法:
public void AddValidation(ClientModelValidationContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
MergeAttribute(context.Attributes, "data-val", "true");
var errorMessage = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
MergeAttribute(context.Attributes, "data-val-requiredif", errorMessage);
MergeAttribute(context.Attributes, "data-val-requiredif-dependentproperty", PropertyName);
var desiredValue = DesiredValue.ToString().ToLower();
MergeAttribute(context.Attributes, "data-val-requiredif-desiredvalue", desiredValue);
}
private bool MergeAttribute(
IDictionary<string, string> attributes,
string key,
string value)
{
if (attributes.ContainsKey(key))
{
return false;
}
attributes.Add(key, value);
return true;
}
这些正在按预期调用,并且值已正确填充,但以下 JS 被忽略。让我怀疑我在两者之间遗漏了一些东西。
$.validator.addMethod("requiredif", function (value, element, parameters) {
var desiredvalue = parameters.desiredvalue;
desiredvalue = (desiredvalue == null ? "" : desiredvalue).toString();
var controlType = $("input[id$='" + parameters.dependentproperty + "']").attr("type");
var actualvalue = {}
if (controlType === "checkbox" || controlType === "radio") {
var control = $("input[id$='" + parameters.dependentproperty + "']:checked");
actualvalue = control.val();
} else {
actualvalue = $("#" + parameters.dependentproperty).val();
}
if ($.trim(desiredvalue).toLowerCase() === $.trim(actualvalue).toLocaleLowerCase()) {
var isValid = $.validator.methods.required.call(this, value, element, parameters);
return isValid;
}
return true;
});
$.validator.unobtrusive.adapters.add("requiredif", ["dependentproperty", "desiredvalue"], function (options) {
options.rules["requiredif"] = options.params;
options.messages["requiredif"] = options.message;
});
有什么想法吗?
编辑:只是为了消除对服务器端是否正常工作的怀疑,而问题几乎肯定在于客户端,这里是为装饰字段生成的 HTML 的片段:
<input class="form-control" type="text" data-val="true" data-val-requiredif="Profession Other Specification is Required" data-val-requiredif-dependentproperty="ProfessionTypeId" data-val-requiredif-desiredvalue="10" id="ProfessionOther" name="ProfessionOther" value="" placeholder="Please Specify Other">
【问题讨论】:
-
您是否在视图中添加了对 jqueryvalidate.js 的脚本引用?
-
您能在视图中向我们展示您的脚本引用吗?
-
-
我遇到了同样的问题。你有运气吗?
标签: javascript c# asp.net-core asp.net-core-mvc