4

是否可以使用 Data Annotation 属性来操作文本并在操作后返回一个新的?

例如,我想验证一个字符串属性是否有特殊字符或单词之间有多个空格,然后返回一个新字符串来替换原始属性的值。

使用数据注释有多大可能?

4

4 回答 4

4

回答有点晚了(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);
    }
}
于 2016-02-16T20:00:26.290 回答
1

Corak 的建议是最好的方法。但是,您可以编写基类并使用反射,您可以对类型成员的内容做任何您想做的事情。

于 2013-03-21T07:48:06.897 回答
0

这不是数据注释,而只是一个属性。

所以是的,通过这里已经讨论过的各种方法:

如何通过自定义 Attribute 获取和修改属性值? 在运行时更改属性的参数

有趣的是注意到从验证到子类到“你不能”的各种解决方案

于 2013-03-21T07:44:53.370 回答
0

这是一个可能包含您所期望的包: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

于 2016-07-20T15:40:12.173 回答