0

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

4

2 回答 2

7

作为替代和更简单的解决方案

Mapper.CreateMap<string, string>().ConvertUsing(
   str => !string.IsNullOrEmpty(str) ? str.Trim() : null
);
于 2016-03-21T12:33:34.700 回答
1

你可以ITypeConverter<M,V>这样使用...

public class ModelToViewModelConverter : ITypeConverter<Model, ViewModel>
{
        public UIItemViewModel Convert(ResolutionContext context)
        {
            Model model = (Model)context.SourceValue;
            // Perform your logic 
        }
}
于 2013-03-23T00:58:07.233 回答