2012-07-12 2 views
0

내 모델 클래스에는 부울 속성 DoNotEmail이 있습니다.MVC 바인드 확인란의 의미를 반전합니다.

UI 디자인에서 뷰를 만들 때 주어진 체크 상자의 의미가 바뀌 었습니다. 즉 체크 박스 옆의 라벨은 "Send Email"입니다.

일반적으로 다음과 같은 체크 박스를 추가합니다. @Html.CheckBoxFor(model => model.DoNotEmail)하지만 분명히 잘못되었습니다.

이 확인란의 사용자 지정 속성을 사용하여 별도의보기 모델을 만들어야합니까, 아니면 내가 할 수있는 똑똑한 방법이 있습니까 : @Html.CheckBoxFor(model => !model.DoNotEmail) (분명히 작동하지 않음)?

이 DontEmail 숨겨진 값 확인 : 주위에 작업을 호출 할 수 있습니다 그것을 할 수

+0

데이터베이스에서 필드를 DoNotEmail''있습니까? 모델 클래스가 엔터티 또는 사용자 지정 모델입니까? – James

+0

예, 데이터베이스의 열이고 모델 클래스는 엔티티입니다. – Andy

답변

2

엔티티를 직접보기에 전달하는 것은 결코 좋은 생각이 아닙니다. DB 스키마가 변경되면 모든보기를 거쳐 업데이트해야합니다. ViewModel을 만들고보기에 필요한 데이터 만 전달한 다음 컨트롤러의 DoNotEmail 속성을 매핑하는 것이 좋습니다. 이렇게하면 모델/뷰간에 추상화를 유지하고 뷰를 간단하게 유지할 수 있습니다.

public void ViewModel 
{ 
    [DisplayName("Send Email")] 
    public bool SendEmailNotification { get; set; } 
} 

보기

@model ViewModel 

@Html.CheckBoxFor(m => m.SendEmailNotifications) 

컨트롤러

public void Post(ViewModel model) 
{ 
    var entity = ...; 
    entity.DoNotEmail = !model.SendEmailNotification; 
} 
+2

+1 감사합니다. 저는 ViewModels만을 사용해야했습니다. 나는 항상 그 (것)들을 이용해야 한 ㄴ다는 것을 본다. – Andy

+0

@Andy 나는 항상보기 모형을 추천하고, 당신에게 청결한 분리를 준다. 많은 곳에서 뷰 모델을 생성해야하는 경우 [AutoMapper] (http://automapper.codeplex.com/)를 살펴보십시오. – James

+0

Thanks @James. AutoMapper가 유용합니다. – Andy

2

간단한 방법이 있다는 것입니다. 그리고 확인란을 만듭니다. jquery 이벤트를 바인딩하고 선택하면 DontEmail의 값을 반전합니다. 나는 이것을 설명하기 위해 코드를 넣지 않아도되기를 바란다. 필요한 경우 알려주십시오.

+0

+1 감사합니다. 나는 그렇게 생각하지 않았습니다. – Andy

관련 문제