数据注释取代财产的价值?

时间:2013-03-21 06:53:46

标签: c# asp.net-mvc asp.net-mvc-3 data-annotations

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

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

使用数据注释的可能性如何?

4 个答案:

答案 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