양식

2010-12-13 2 views
0

안녕,양식

나는 ASP.NET MVC 응용 프로그램을 구축하고을 (자동 매핑을) 문제를 모델과 데이터 처리에 일부 문제가있는 볼 수 있습니다. 내 행동의

하나는 다음과 같습니다

public ActionResult Register(int categoryId, int? filterId) 

DB (엔티티 프레임 워크)의 데이터 객체를 뷰 모델 사용자 정의를로드하는 것을 의미한다이 경우 등록 양식과 instansiate과 보낼 것이 작업 그것은 강력하게 유형화 된 뷰에 적용됩니다.

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

이 작업은 실행됩니다 :

내가 사용자가 데이터를 수정하고 명중 한 경우 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 유형입니다. 이를 표현하기 위해 내 뷰 객체에 nullable bool을 만들었습니다. 모델 뷰에 모델로 변환하는 AutoMapper를 사용할 때 나는 다음과 같은 예외를 얻을 :

이 System.Nullable`1 [선택 System.Boolean, mscorlib에, 버전 = 4.0 System.Byte을지도하려고합니다. 0.0, 문화 = 중립, PublicKeyToken = b77a5c561934e089]]. Biss.Models.Model.AdCategoryFilter에 대한 매핑 구성을 사용 Biss.Views.ViewClasses.RegisterFilterItem 대상 속성 에 : 유형 의 DisplayCheckBox 예외 'AutoMapper.AutoMapperMappingException' 가 발생했다.

나는 모델 클래스의 생성 된 속성을 cheked하고는 같이 :

Nullable<global::System.Byte> 

문제 2 양식이 양식에서 뷰 모델 객체가 데이터로 채워집니다 제출 . 값이 ""(string.empty) 인 textBox가 있으면 문자열이 null로 설정됩니다.

이 텍스트 상자를 나타내는 db 필드는 nchar (100) 유형이며 엔터티 프레임 워크에서 문자열로 생성됩니다. 문제는 그 automapper 모델 개체의 DisplayTextBox 속성에 null 값을 설정하기 위해 노력할 것입니다 그리고는 따라와 예외가 발생합니다 :

이 속성은 null 값으로 설정 할 수 없습니다.

감사합니다.

답변

1

1) Automapper는 암시 적 변환을하지 않습니다. automappers extensibility points 중 하나를 사용하여 값을 변환하는 방법을 지정해야합니다.

의견에 회신하기. 이 테스트는 예외를 throw합니다.

[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] 속성을 사용하여 해당 등록 정보를 무시하거나 모델 바인드를 시도하기 전에 게시 된 양식 값을 확인하십시오.

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

관련 문제