我是新的屬性。我只是在我的控制檯應用程序上嘗試它。如何驗證此屬性(annonation)?
那麼我如何驗證我的人實例下面的例子?
class Person
{
[StringLength(8,ErrorMessage="Please less then 8 character")]
public string Name { get; set; }
}
我是新的屬性。我只是在我的控制檯應用程序上嘗試它。如何驗證此屬性(annonation)?
那麼我如何驗證我的人實例下面的例子?
class Person
{
[StringLength(8,ErrorMessage="Please less then 8 character")]
public string Name { get; set; }
}
這裏是沒有反射的簡單代碼示例。
class Program
{
static void Main(string[] args)
{
var invalidPerson = new Person { Name = "Very long name" };
var validPerson = new Person { Name = "1" };
var validator = new Validator<Person>();
Console.WriteLine(validator.Validate(validPerson).Count);
Console.WriteLine(validator.Validate(invalidPerson).Count);
Console.ReadLine();
}
}
public class Person
{
[StringLength(8, ErrorMessage = "Please less then 8 character")]
public string Name { get; set; }
}
public class Validator<T>
{
public IList<ValidationResult> Validate(T entity)
{
var validationResults = new List<ValidationResult>();
var validationContext = new ValidationContext(entity, null, null);
Validator.TryValidateObject(entity, validationContext, validationResults, true);
return validationResults;
}
}
我沒有檢查過你的代碼,但我想你的解決方案更好,因爲你已經使用了原生的DataAnnonations類。我也在嘗試,但沒有足夠的經驗來弄清楚。 – Freshblood 2010-07-05 22:16:07
我在一些小型項目中使用了這種方法。由於必須執行AssociatedMetadataTypeTypeDescriptionProvider的手動註冊,因此唯一的問題是您要使用MetadataType屬性。 – 2010-07-05 22:27:11
完美的作品,這就是我一直在尋找。它甚至不檢查屬性。 – Freshblood 2010-07-05 22:28:10
Attribute可以處理的唯一函數是描述,爲成員提供一些描述性數據。它們純粹是被動的,不能包含任何邏輯。 (有一些AOP框架可以使屬性生效)。所以如果你想要邏輯,你必須創建另一個類,它將使用MemberInfo.GetCustomAttributes
來讀取屬性,並進行驗證並返回結果。
下面的代碼演示如何確定驗證僅性質,並給出方法,類等
public class DataValidator
{
public class ErrorInfo
{
public ErrorInfo(string property, string message)
{
this.Property = property;
this.Message = message;
}
public string Message;
public string Property;
}
public static IEnumerable<ErrorInfo> Validate(object instance)
{
return from prop in instance.GetType().GetProperties()
from attribute in prop.GetCustomAttributes(typeof(ValidationAttribute), true).OfType<ValidationAttribute>()
where !attribute.IsValid(prop.GetValue(instance, null))
select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty));
}
}
想法驗證將此代碼添加到項目中,我們可以用它之後:
var errors =DataValidator.Validate(person);
foreach (var item in errors)
{
Console.WriteLine(item.Property +" " + item.Message);
}
我熟悉ASP.NET MVC中的DataAnnotations和驗證,但我不確定它是如何在控制檯應用程序中一起出現的。我對這個答案也很感興趣。 – 2010-07-05 21:15:53
我不相信這些屬性在MVC之外有任何影響/「動態數據控件」(?) - 請參閱http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx – 2010-07-05 21:18:59
我在MVC應用程序中使用它們,但它不適用於MVC。所以我想了解attritubes。如果你對答案感興趣,所以你可以投票問題,並選擇你最喜歡的問題獲得更多的好回答:) – Freshblood 2010-07-05 21:20:07