asp.net-mvc - RequiredIf 具有不显眼验证的自定义验证器
问题描述
前几天我构建了一个自定义属性,以验证在选择特定枚举项时该字段是否填充了值。
我编写了类和函数,并且验证器方法在服务器端和客户端都被命中,但无论出于何种原因,尽管 form.valid() 返回 false,但没有错误消息。
看在上帝的份上,我无法弄清楚我做错了什么。
模型
[RequiredIf("AntragStatus", new object[] { AntragStatus.UnterlagenAngefordert })]
public string Bearbeiter { get; set; }
验证器
public class RequiredIf : ValidationAttribute, IClientValidatable
{
private string _dependentProperty { get; set; }
private object[] _targetValues { get; set; }
public RequiredIf(string dependentProperty, object[] targetValues)
{
_dependentProperty = dependentProperty;
_targetValues = targetValues;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var field = validationContext.ObjectType.GetProperty(_dependentProperty);
var fieldValue = field.GetValue(validationContext.ObjectInstance, null);
var fieldValueEqualsTargetValue = false;
foreach (var targetValue in _targetValues)
{
if (fieldValue.Equals(targetValue))
{
fieldValueEqualsTargetValue = true;
if (value != null)
{
return ValidationResult.Success;
}
}
}
return fieldValueEqualsTargetValue ? new ValidationResult("Es sind nicht alle benötigten Felder gefüllt!") : ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "requiredif"
};
rule.ValidationParameters.Add("dependentproperty", _dependentProperty);
rule.ValidationParameters.Add("targetvalues", GetTargetValues());
yield return rule;
}
private string GetTargetValues()
{
var tValues = "";
foreach (var targetValue in _targetValues)
{
tValues += targetValue + ",";
}
tValues = tValues.Remove(tValues.Length - 1);
return tValues;
}
}
JavaScript
$.validator.addMethod("requiredif",
function (value, element, parameters) {
var isInTargetValues = false;
var id = parameters["dependentproperty"];
var targetValues = parameters["targetvalues"].split(",");
var controls = ASPxClientControl.GetControlCollection();
var statusValue = controls.GetByName(id).GetValue();
for (var i = 0; i < targetValues.length; i++) {
if (targetValues[i] == statusValue) {
isInTargetValues = true;
if ($.trim(value) != "") {
return true;
}
}
}
if (!isInTargetValues) {
return true;
} else {
return false;
}
});
$.validator.unobtrusive.adapters.add(
"requiredif",
["dependentproperty", "targetvalues"],
function (options) {
options.rules["requiredif"] = {
dependentproperty: options.params["dependentproperty"],
targetvalues: options.params["targetvalues"]
};
var msg = "Das Feld " + options.element.name + " muss gefüllt sein";
options.messages["requiredif"] = msg;
});
网络配置
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="PreserveLoginUrl" value="true" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="vs:EnableBrowserLink" value="false" />
</appSettings>
剃刀
@{
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
}
解决方案
推荐阅读
- python - 是否可以将 GradCam 应用于 TF Lite 模型
- docker - 网关连接 hyperledger-fabric-application 期间出错
- microsoft-graph-api - Microsoft Graph API,损坏的文件
- javascript - redis LPOP'不正确的标头检查'后nodejs zlib膨胀错误
- python - 使用 Python 在 Cloud Function 中创建 Sheets API 身份验证
- c# - 从 cete 动态 pdf 获取错误:ceTe.DynamicPDF.Imaging.ImageParsingException:不支持 TIFF 压缩值 8 (Flate/Deflate)
- moodle-api - core_course_create_courses 的 URL
- docker - Docker:无法复制 xattrs:无法设置 xattr“security.selinux”
- python - 如何在 tkinter 中使用迭代显示多个相同的图像
- javascript - 在聚类向量和非聚类向量上使用样式