首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表单到视图到模型问题(AutoMapping)

表单到视图到模型问题(AutoMapping)
EN

Stack Overflow用户
提问于 2010-12-13 20:46:00
回答 1查看 1K关注 0票数 0

Hi,

我正在构建一个ASP.NET MVC应用程序,在数据处理方面有一些问题。

我的一个行动看起来是这样的:

代码语言:javascript
复制
public ActionResult Register(int categoryId, int? filterId)

此操作将实例化注册表单,在本例中,这意味着用DB(EntityFramework)中的数据加载自定义的对象,并将其发送到强类型视图。

若要将模块对象转换为视图对象,请使用AutoMapper

当用户修改数据并点击提交时,将触发以下操作:

代码语言:javascript
复制
[CustomAuthorize(Roles = SiteRoles.Admin)]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Register(ModelViewRegisterFilter filter)

此操作将运行以下代码:

代码语言:javascript
复制
        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异常。

我检查了模型类的生成属性,它看起来如下所示:

代码语言:javascript
复制
Nullable<global::System.Byte>

问题2当表单提交时,视图模型对象将被表单中的数据填充。如果有一个textBox,其值为"“(string.empty),则该字符串将设置为null。

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

不能将此属性设置为空值。

--请给我建议.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-13 21:56:11

1) Automapper不为您进行任何隐式转换。您必须指定如何使用自动扩展点之一转换该值。

回复评论。此测试将引发异常:

代码语言:javascript
复制
   [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/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4433339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档