gpt4 book ai didi

asp.net-mvc - ASP.NET MVC : How to execute Data Annotation validations in the service layer?

转载 作者:行者123 更新时间:2023-12-01 01:36:27 26 4
gpt4 key购买 nike

在最近提出的一个问题中:
ASP.NET MVC: Is Data Annotation Validation Enough?

...得出的结论是,依靠数据注释验证(由模型绑定(bind)器触发)不足以确保始终执行验证。我们仍然需要在服务层(或 ModelBinding 发生后的其他地方)添加相同的验证逻辑。不幸的是,我们将复制我们的验证代码(一次是使用数据注释,一次是在服务层)。服务层是否有一种简单的方法可以根据数据注释中定义的内容触发验证?如果这是可能的,那么我们将两全其美......我们不需要重复验证代码,但我们仍将确保验证始终被执行。

最佳答案

在此博客的帮助下:http://goneale.com/2009/03/04/using-metadatatype-attribute-with-aspnet-mvc-xval-validation-framework/
我能够创建一个方法,该方法将根据数据注释定义的验​​证来测试我的对象。它将执行从 ValidateAttribute 派生的任何验证属性。我现在可以将我的对象从我的服务层(或 DomainModel)传递给这个方法,并且我的服务层不再依赖于 Controller 。这将确保在将数据持久化到数据库之前始终执行验证。我无法按原样使用博客上的代码,因为我似乎无法访问 Graham 使用的一些扩展方法,所以这是我的版本:

    public static IList<KeyValuePair<string, string>> GetErrors(object obj)
{
// get the name of the buddy class for obj
MetadataTypeAttribute metadataAttrib = obj.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).FirstOrDefault() as MetadataTypeAttribute;

// if metadataAttrib is null, then obj doesn't have a buddy class, and in such a case, we'll work with the model class
Type buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : obj.GetType();

var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>();
var modelClassProperties = TypeDescriptor.GetProperties(obj.GetType()).Cast<PropertyDescriptor>();

var errors = from buddyProp in buddyClassProperties
join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name // as this is an inner join, it will return only the properties that are in both the buddy and model classes
from attribute in buddyProp.Attributes.OfType<ValidationAttribute>() // get only the attributes of type ValidationAttribute
where !attribute.IsValid(modelProp.GetValue(obj))
select new KeyValuePair<string, string>(buddyProp.Name, attribute.FormatErrorMessage(string.Empty));

return errors.ToList();
}

此代码适用于有和没有伙伴类的两个类,但如果您不使用伙伴类,则可以稍微简化此代码。
希望这个对你有帮助。

关于asp.net-mvc - ASP.NET MVC : How to execute Data Annotation validations in the service layer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1562717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com