2010-12-13 52 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