我有以下情况:域模型和视图模型(DTO)。我使用数据注释在 DTO 上的客户端和服务器端执行数据验证。但我还必须在域模型上执行业务规则。为此,我选择了 Enterprise Library Validation Application Block。验证结果作为 ValidationResults 返回。我有一个扩展方法可以复制 ValidationResults 中的错误,但问题是域模型不是 1:1 mappet 到视图模型。我使用 automapper 来执行这些映射。所以我的问题是:有没有办法使用映射配置文件中定义的映射将错误消息从验证结果中的键复制到 ModelState 中的相应属性
问问题
1011 次
1 回答
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 映射的扩展方法,我找到了必须附加错误消息的属性。我希望这将涵盖所有方面。我欢迎任何其他建议!
于 2013-10-17T11:30:51.983 回答