是否可以使用Data Annotation属性来操作文本并在操作后返回一个新文本?
例如,我想验证字符串属性是否在单词之间有特殊字符或多个空格,然后返回一个新字符串来替换原始属性的值。
使用数据注释的可能性如何?
答案 0 :(得分:2)
回答有点晚(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);
}
}
答案 1 :(得分:1)
Corak的建议是最好的方法。但是,您可以编写基类并使用反射,您可以使用类型成员的内容执行任何操作。
答案 2 :(得分:0)
这不是数据注释,只是属性。
所以通过这里讨论过的各种方法是这样的:
How to get and modify a property value through a custom Attribute? Change Attribute's parameter at runtime
有趣的是要注意从验证到子类到“你不能”的各种解决方案
答案 3 :(得分:0)
这是一个可能具有您期望的包:Dado.ComponentModel.Mutations
此示例将确保从字符串中删除无效字符。它不会引入验证,但Sub replaceingError()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim StrTemp As String
Dim Divider As String
StrTemp = ws.Range("c6").formula
MsgBox (StrTemp)
Divider = Right(StrTemp, 2)
MsgBox (Divider)
ws.Range("c6").value = "=IF(Divider=0, 0, strTemp)"
End Sub
可以与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();
后,Mutate()
将变为user.UserName
。