2010-12-13 9 views
0

こんにちは、フォーム(自動マッピング)

私はASP.NET MVCアプリケーションを構築し、データ処理といくつかの問題を抱えているのです。

私の行動の一つは、次のようになります。

public ActionResult Register(int categoryId, int? filterId) 

このアクションは、DB(Entity Frameworkの)からのデータでカスタムのViewModelオブジェクトをロードして送信することを意味登録フォームと、この場合にはinstansiateます強く型付けされたビューに変換します。

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

このアクションを実行します:ユーザーがデータを変更し、followinアクションがトリガされます提出ヒットしたとき、私はAutoMapper

を使用していますビューオブジェクトにモジュールオブジェクトを変換するために

次のコード:

 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 私はdbテーブルcaled DisplayCheckBoxにフィールドを持ち、nullable tinyint型です。これを表現するために、私はビューオブジェクトにヌルブルブールを作成しました。モデルからのModelViewに変換するためにAutoMapperを使用したとき、私は次の例外を取得:

は System.Nullable`1 [[可能System.Boolean、 mscorlib、バージョン= 4.0にSystem.Byteをマップしようとしています。 0.0、 文化=ニュートラル、 PublicKeyToken = b77a5c561934e089]]。 Biss.Views.ViewClasses.RegisterFilterItem 先プロパティに Biss.Models.Model.AdCategoryFilterのマッピング設定を使用:DisplayCheckBoxタイプ の 例外を 'AutoMapper.AutoMapperMappingException' がスローされました。

私はモデルクラスの生成されたプロパティをchekedて、それは次のようになります。

Nullable<global::System.Byte> 

問題2のフォームは、フォームからのviewmodelオブジェクトがデータで満たされます提出され 。値が ""(string.empty)のtextBoxがある場合、文字列はnullに設定されます。

このテキストボックスを表すdbフィールドはnchar(100)型で、これはエンティティフレームワークによって文字列に生成されます。問題はautomapperがモデルオブジェクトにDisplayTextBoxプロパティにnull値を設定し、それがfollowin例外がスローされますしようとすることです。

このプロパティをNULL値に設定することができません。

喜んでアドバイスします。

答えて

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)ヌルにすることはできないプロパティを設定しないでください。モデルをバインドしようとする前に、[Bind]属性を使用してそのプロパティーを無視するか、ポストされたフォーム値をヌルにチェックしてください。ここでbind属性を使用しておよそまともな記事です:

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

+0

実は、Automapperについてのあなたのポイントが正しくありません。彼が行う必要があるのは、Mapを呼び出す前にCreateMap を呼び出すことだけです。 – rboarman

+0

それは変です。私は何か特別なことをすることなく、その場でAMを使用しました。 – rboarman

+0

これは新しい質問を生成します1 =バインド属性を使用するといくつかのプロパティが除外されますが、AutoMapperを使用してViewObjectをDataModelObjectにマップすると、この機能はどのように機能しますか?私はdb(DataModelObject)からの "実際の"データがViewObjectの未設定のプロパティに置き換えられることを納得させますか? – Banshee

関連する問題