2010-12-13 47 views
0

嗨,表单要查看对模型问题(自动映射)

我建立一个ASP.NET MVC应用程序,有一些问题与数据处理。

我的一个动作是这样的:

public ActionResult Register(int categoryId, int? filterId) 

这一行动将instansiate在这种情况下,这意味着要加载自定义视图模型与DB(实体框架)数据对象的登记表,并发送它到强类型的视图。

要翻译模块对象视图对象我使用AutoMapper

当用户修改了数据,并点击提交的跟随着动作将被触发。

[CustomAuthorize(Roles = SiteRoles.Admin)] 
     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Register(ModelViewRegisterFilter filter) 

此操作将运行以下代码:

 if(filter.EditingFilter.Id > 0) 
      adCategoryFilter = Mapper.Map<RegisterFilterItem, AdCategoryFilter>(filter.EditingFilter, filterModel.GetFilter(filter.EditingFilter.Id)); 
     else 
      adCategoryFilter = Mapper.Map<RegisterFilterItem, AdCategoryFilter>(filter.EditingFilter); 

adCategoryFilter是Model(db)中的一个类。完成后,保存实体模型对象(adCategoryFilter)应该没有任何问题。

问题1 我在数据库表中有一个字段,其中包含DisplayCheckBox,它的类型为nullable tinyint。为了表示这个,我在视图对象中创建了一个可为空的布尔值。当使用AutoMapper从模型到模型视图翻译我得到以下异常:

试图System.Byte映射到 System.Nullable`1 [[System.Boolean, mscorlib程序,版本= 4.0。 0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]]。 使用对 Biss.Models.Model.AdCategoryFilter映射配置到 Biss.Views.ViewClasses.RegisterFilterItem 目的地属性:DisplayCheckBox 异常 类型的 'AutoMapper.AutoMapperMappingException' 被抛出。

我已经cheked模型类的生成的属性和它看起来像这样:

Nullable<global::System.Byte> 

问题2 当表单提交从表单的视图模型对象将被填充数据。如果有一个文本框的值为“”(string.empty),那么该字符串将被设置为null。

表示此文本框的db字段的类型为nchar(100),它由实体框架生成为字符串。问题是,automapper会尝试将空值设置为模型对象上的DisplayTextBox属性,并且会抛出以下异常:

此属性不能设置为空值。

请指教。

回答

1

1)Automapper不会为您做任何隐式转换。您必须指定如何使用automappers extensibility points之一转换该值。

回复评论。此测试将抛出异常:

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Mapper.CreateMap<HasByte, HasBool>(); 

     var hasByte = new HasByte() { Value = 1 }; 

     var hasBool = Mapper.Map<HasByte, HasBool>(hasByte); 
    } 
} 

public class HasByte 
{ 
    public Nullable<Byte> Value { get; set; } 
} 

public class HasBool 
{ 
    public Nullable<bool> Value { get; set; } 
} 

2)不要将不能为null的属性设置为null。使用[Bind]属性忽略该属性,或在尝试对模型进行绑定之前检查发布的表单值为null。下面是有关使用绑定属性像样的文章:

http://ittecture.wordpress.com/2009/05/01/tip-of-the-day-199-asp-net-mvc-defining-model-binding-explicitly/

+0

其实,你对Automapper点不正确。他所需要做的就是在调用Map之前调用CreateMap 。 – rboarman 2010-12-13 22:30:11

+0

这很奇怪。我在整个地方都使用了AM,而不必做任何特别的事情。 – rboarman 2010-12-13 23:25:18

+0

这产生了新的问题1 =如果我使用绑定属性会排除一些属性,当使用AutoMapper将ViewObject映射到DataModelObject时,这将如何工作?我认为来自db(DataModelObject)的“真实”数据将被替换为ViewObject的未设置属性? – Banshee 2010-12-14 08:28:24