我有,比方说,这个简单的课程:
public class User
{
[Required(AllowEmptyStrings = false, ErrorMessage="EmailIsRequired"]
public string EmailAddress { get; set; }
}
我知道如何在System.ComponentModel.DataAnnotations命名空间中使用Validator.TryValidateProperty和Validator.TryValidateObject。为了使其工作,您需要一个要验证的对象的实际实例。
但是现在,我想在没有User类实例的情况下验证某个值,例如:
TryValidateValue(typeof(User), "EmailAddress", "test@test.com");
目标是我想在实际实例化对象本身之前测试一个值(原因是我只允许创建有效的域实体)。所以实际上我想在类而不是实例上使用验证属性。
有什么想法可以做到吗?
谢谢!
编辑:同时我决定不使用数据注释,而是使用http://fluentvalidation.codeplex.com,以便验证移出实体之外。这样,可以从实体内部以及我的命令处理程序中触发验证。由于流利的符号,验证本身看起来更具可读性。
答案 0 :(得分:17)
以下是您可以使用TryValidateValue方法的示例:
public class User
{
[Required(AllowEmptyStrings = false, ErrorMessage = "EmailIsRequired")]
public string EmailAddress { get; set; }
}
class Program
{
static void Main()
{
var value = "test@test.com";
var context = new ValidationContext(value, null, null);
var results = new List<ValidationResult>();
var attributes = typeof(User)
.GetProperty("EmailAddress")
.GetCustomAttributes(false)
.OfType<ValidationAttribute>()
.ToArray();
if (!Validator.TryValidateValue(value, context, results, attributes))
{
foreach (var result in results)
{
Console.WriteLine(result.ErrorMessage);
}
}
else
{
Console.WriteLine("{0} is valid", value);
}
}
}