使用 AttributeTargets.Class 对自定义 ValidationAttribute 进行客户端验证
是否可以为类范围内使用的自定义 ValidationAttribute 实现客户端验证?例如我的 MaxLengthGlobal,它应该确保所有输入字段的全局最大限制。
[AttributeUsage(AttributeTargets.Class)]
public class MaxLengthGlobalAttribute : ValidationAttribute, IClientValidatable
{
public int MaximumLength
{
get;
private set;
}
public MaxLengthGlobalAttribute(int maximumLength)
{
this.MaximumLength = maximumLength;
}
public override bool IsValid(object value)
{
var properties = TypeDescriptor.GetProperties(value);
foreach (PropertyDescriptor property in properties)
{
var stringValue = property.GetValue(value) as string;
if (stringValue != null && (stringValue.Length > this.MaximumLength))
{
return false;
}
}
return true;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = this.FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "maxlengthglobal",
};
rule.ValidationParameters.Add("maxlength", this.MaximumLength);
yield return rule;
}
}
谢谢。
Is it possible to implement client-site validation for custom ValidationAttribute, which is used in Class scope? For example my MaxLengthGlobal, which should assure global max limit for all input fields.
[AttributeUsage(AttributeTargets.Class)]
public class MaxLengthGlobalAttribute : ValidationAttribute, IClientValidatable
{
public int MaximumLength
{
get;
private set;
}
public MaxLengthGlobalAttribute(int maximumLength)
{
this.MaximumLength = maximumLength;
}
public override bool IsValid(object value)
{
var properties = TypeDescriptor.GetProperties(value);
foreach (PropertyDescriptor property in properties)
{
var stringValue = property.GetValue(value) as string;
if (stringValue != null && (stringValue.Length > this.MaximumLength))
{
return false;
}
}
return true;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = this.FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "maxlengthglobal",
};
rule.ValidationParameters.Add("maxlength", this.MaximumLength);
yield return rule;
}
}
Thank you.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我在寻找同一问题的解决方案时找到了这个答案,并提出了解决方法。
使用 2 个而不是 1 个 ValidationAttribute:
1.) ServerValidationAttribute 将位于类上,并且不会实现 IClientValidatable。
2.) ClientValidationAttribute 将位于字段/属性上,并将实现 IClientValidatable,但 IsValid 重写始终返回 true。
在客户端执行时,服务器属性被忽略,反之亦然。
如果您需要在类上具有验证属性,则验证可能会针对多个字段进行。我添加了一些样板代码,用于将附加参数传递给客户端验证方法,但它没有按我的预期工作。在我的实际代码中,我注释掉了 viewContext 和 dependentProperty1 变量,并将“DependentProperty1”字符串传递给了rule.ValidationParameters.Add 方法的第二个参数。由于某种原因,我得到了不正确的 HtmlFieldPrefix。如果有人可以帮助解决这个问题,请发表评论...
无论如何,您最终会得到这样的视图模型:
这样的客户端脚本:
和这样的视图:
然后,如果您禁用了客户端验证,则
@Html.ValidationMessageFor显示 (m => m)
而不是属性的显示。I found this answer while looking for a solution to the same problem, and came up with a workaround.
Instead of 1 ValidationAttribute, have 2:
1.) A ServerValidationAttribute will be on the class, and will not implement IClientValidatable.
2.) A ClientValidationAttribute will be on the field / property, and will implement IClientValidatable, but the IsValid override always returns true.
When executed on the client, the server attribute is ignored, and vice versa.
If you need to have a validation attribute on the class, chances are the validation happens against multiple fields. I dropped in some boilerplate code for passing additional parameters to the client validation method, but it's not working as I expected. In my actual code I have commented out the viewContext and dependentProperty1 vars, and just passed a "DependentProperty1" string to the second argument of the rule.ValidationParameters.Add method. For some reason, I'm getting an incorrect HtmlFieldPrefix. If anyone can help with this please comment...
Anyway, you end up with a viewmodel like this:
A client script like this:
And a view like this:
Then if you have client validation disabled, the
@Html.ValidationMessageFor(m => m)
is displayed instead of the one for the property.不,这是不可能的。对不起。
Nope, it's not possible. Sorry.