我正在将WinForms应用程序转换为ASP.NET MVC4并尝试使用AutoMapper实现ViewModel方法,以在域实体和ViewModel之间进行映射,主要是为了将更复杂的对象图形展平为ViewModel,以便在视图中轻松绑定
我遇到的问题是,当某些字段留空时,域模型想要应用Trim()
,则会抛出NullReferenceException
。
最初这是在域对象中处理的,例如在Customer对象中我有一个字符串属性,它修剪以确保传递的任何值被修剪,并且这样就不必将原始的WinForms与Trim混合在一起可以设置,只需依靠将其传递给域模型,并让它设置为Trim或ToUpper,因为值是持久的。
public virtual String Name
{
get { return _name; }
set { _name = StringFormatting.ToTitleCase(value.Trim()); }
}
public virtual String Email
{
get { return _email; }
set { _email = value.Trim(); }
}
就我的ViewModel而言,我刚刚获得了自动实现的属性:
public class CustomerCreateViewModel
{
[Required(ErrorMessage="Please enter a name for this customer")]
public string Name { get; set; }
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
}
但是,如果在提交表单时电子邮件文本框为空,则会引发NullReferenceException
设置{_email = value.Trim(); }
为了解决这个问题,我添加了一个塞特护卫条款
public virtual String Email
{
get { return _email; }
set
{
if (_email == value) return;
_email = value.Trim();
}
}
并且工作因为该字段的错误消失了,但它移动到了下一个属性Mobile - 我重复了修复,然后转到下一个和下一个和下一个。这些都不是必需的,因此将它们传递给空是正确的。
AutoMapper中是否有一种方法可以指定要修剪所有被映射的字符串? 我错误地接近了这个;是不是必须修剪字符串?或者下落应该进行修剪,我的偏好是只需要在提交时修剪字符串,而不是在任何单个控制器的代码中,感觉它应该在ViewModel / Domain模型中的某个地方完成,但是在哪里?
答案 0 :(得分:4)
作为替代和更容易的解决方案
Mapper.CreateMap<string, string>().ConvertUsing(
str => !string.IsNullOrEmpty(str) ? str.Trim() : null
);
答案 1 :(得分:1)
您可以像这样使用ITypeConverter<M,V>
......
public class ModelToViewModelConverter : ITypeConverter<Model, ViewModel>
{
public UIItemViewModel Convert(ResolutionContext context)
{
Model model = (Model)context.SourceValue;
// Perform your logic
}
}