Hi,
我正在构建一个ASP.NET MVC应用程序,在数据处理方面有一些问题。
我的一个行动看起来是这样的:
public ActionResult Register(int categoryId, int? filterId)此操作将实例化注册表单,在本例中,这意味着用DB(EntityFramework)中的数据加载自定义的对象,并将其发送到强类型视图。
若要将模块对象转换为视图对象,请使用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 i在db表中有一个字段,称为DisplayCheckBox,它的类型是可为空的tinyint。为了表示这一点,我在视图对象中创建了一个可为空的bool。当使用AutoMapper从模型转换为ModelView时,我得到以下异常:
试图将System.Byte映射到System.Nullable`1[System.Boolean,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]。使用Biss.Models.Model.AdCategoryFilter到Biss.Views.ViewClasses.RegisterFilterItem目标属性的映射配置:引发“AutoMapper.AutoMapperMappingException”类型的DisplayCheckBox异常。
我检查了模型类的生成属性,它看起来如下所示:
Nullable<global::System.Byte>问题2当表单提交时,视图模型对象将被表单中的数据填充。如果有一个textBox,其值为"“(string.empty),则该字符串将设置为null。
表示此文本框的db字段的类型为nchar(100),这是由实体框架生成的字符串。问题是,automapper将尝试将空值设置为模型对象上的DisplayTextBox属性,这将引发以下异常:
不能将此属性设置为空值。
--请给我建议.
发布于 2010-12-13 21:56:11
1) Automapper不为您进行任何隐式转换。您必须指定如何使用自动扩展点之一转换该值。
回复评论。此测试将引发异常:
[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)不要将不能为空的属性设置为空。使用[Bind]属性可以忽略该属性,或者在尝试绑定模型之前检查已发布的表单值是否为null。下面是一篇关于使用Bind属性的不错文章:
http://ittecture.wordpress.com/2009/05/01/tip-of-the-day-199-asp-net-mvc-defining-model-binding-explicitly/
https://stackoverflow.com/questions/4433339
复制相似问题