AutoMapper中是否有一种方法可以指定要修剪所有要映射的字符串

时间:2013-03-23 00:31:55

标签: asp.net-mvc razor mvvm automapper

我正在将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模型中的某个地方完成,但是在哪里?

2 个答案:

答案 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 
        }
}