我有以下情况: 域模型和视图模型(DTO)。 我在DTO的客户端和服务器端使用数据注释执行数据验证。 但我也必须在域模型上执行业务规则。为此,我选择了企业库验证应用程序块。 验证结果作为ValidationResults返回。 我有一个扩展方法来复制ValidationResults中的错误,但问题是域模型与视图模型不是1:1。我使用automapper来执行这些映射。 所以我的问题是:有没有办法使用映射配置文件中定义的映射将错误消息从验证结果中的键复制到ModelState中的相应属性
答案 0 :(得分:2)
我想出了这个解决方案:
public static class ModelStateExtensions
{
/// <summary>
///
/// </summary>
/// <typeparam name="Tin">ViewModel Type</typeparam>
/// <typeparam name="Tout">Domain ModelType</typeparam>
/// <param name="modelstate">controllers modelstate</param>
/// <param name="results">Results of validation</param>
public static void AddValidationResult<Tin, Tout>(this ModelStateDictionary modelstate, ValidationResults results)
where Tout : class
where Tin : class
{
var map = AutoMapper.Mapper.FindTypeMapFor<Tout, Tin>();
var properties = map.GetPropertyMaps();
string destinationPropertyName=string.Empty;
foreach (var result in results)
{
var property = properties.FirstOrDefault(pm => pm.SourceMember!=null && pm.SourceMember.Name.Equals(result.Key));
if (property!=null)
{
destinationPropertyName=property.DestinationProperty.Name;
}
else
{
destinationPropertyName=string.Empty;
}
modelstate.AddModelError(destinationPropertyName, result.Message);
}
}
}
我添加了一个基于AutoMapper映射的扩展方法,我找到了必须附加错误消息的属性。 我希望这将涵盖所有方面。 我欢迎任何其他建议!