我正在将 WinForms 应用程序转换为 ASP.NET MVC4,并尝试使用 AutoMapper 实现 ViewModel 方法,以在域实体和 ViewModel 之间进行映射,主要是将更复杂的对象图展平为 ViewModel,以便在视图中轻松绑定。
我遇到的问题是,当将域模型想要应用的某些字段留空时,会抛出Trim()
a 。NullReferenceException
最初这一切都是在域对象中处理的,例如在 Customer 对象中,我有一个字符串属性,可以修剪以确保修剪传入的任何值,这样就不必在任何可以设置值的地方用 Trim 弄乱原始 WinForms ,只需将其传递给域模型并让它设置执行 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() ; }
为了解决这个问题,我添加了一个 setter 保护子句
public virtual String Email
{
get { return _email; }
set
{
if (_email == value) return;
_email = value.Trim();
}
}
并且该字段的错误消失了,但它移动到了下一个属性,Mobile - 我重复了修复,然后到下一个,下一个和下一个。这些都不是必需的,因此将它们传入空是正确的。
AutoMapper 中是否有办法指定要修剪所有被映射的字符串?我是不是错误地接近了这个?不需要修剪字符串吗?或者应该在哪里进行修剪,我的偏好是只需要在提交字符串时修剪它们,而不是在任何单个控制器的代码中,感觉应该在 ViewModel / Domain 模型的某个地方完成,但是在哪里?