是否可以使用 Data Annotation 属性来操作文本并在操作后返回一个新的?
例如,我想验证一个字符串属性是否有特殊字符或单词之间有多个空格,然后返回一个新字符串来替换原始属性的值。
使用数据注释有多大可能?
是否可以使用 Data Annotation 属性来操作文本并在操作后返回一个新的?
例如,我想验证一个字符串属性是否有特殊字符或单词之间有多个空格,然后返回一个新字符串来替换原始属性的值。
使用数据注释有多大可能?
回答有点晚了(2 年!),但是是的,您可以修改在自定义 DataAnnotations 属性中验证的值。关键是重写 ValidationAttribute 的IsValid(Object, ValidationContext)方法并执行一些反射魔法:
public class MyCustomValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext ctx)
{
// get the property
var prop = ctx.ObjectType.GetProperty(ctx.MemberName);
// get the current value (assuming it's a string property)
var oldVal = prop.GetValue(ctx.ObjectInstance) as string;
// create a new value, perhaps by manipulating the current one
var newVal = "???";
// set the new value
prop.SetValue(ctx.ObjectInstance, newVal);
return base.IsValid(value, ctx);
}
}
Corak 的建议是最好的方法。但是,您可以编写基类并使用反射,您可以对类型成员的内容做任何您想做的事情。
这不是数据注释,而只是一个属性。
所以是的,通过这里已经讨论过的各种方法:
如何通过自定义 Attribute 获取和修改属性值? 在运行时更改属性的参数
有趣的是注意到从验证到子类到“你不能”的各种解决方案
这是一个可能包含您所期望的包:Dado.ComponentModel.Mutations
此示例将确保从字符串中删除无效字符。它没有引入验证,但System.ComponentModel.Annotations
可以与Dado.ComponentModel.Mutations
.
public partial class ApplicationUser
{
[ToLower, RegexReplace(@"[^a-z0-9_]")]
public virtual string UserName { get; set; }
}
// Then to preform mutation
var user = new ApplicationUser() {
UserName = "M@X_speed.01!"
}
new MutationContext<ApplicationUser>(user).Mutate();
调用 to 后Mutate()
,user.UserName
将变为mx_speed01
。