2012-06-06 2 views
5

면도기를 사용하여 ASP.NET MVC3에서 작업하고 있습니다. 부울 속성을 기반으로 확인란을 비활성화 할 수있는 상황이 있습니다. 나는이 확인란을 MoreInstructorsAllowed 속성의 기준으로 사용하지 활성화 할ASP.NET MVC3 @ Html.EditorFor 체크 상자 사용 안 함

@Html.EditorFor(model => model.IsInstructor) 

: 내 cshtml 파일에 지금

public bool IsInstructor { get; set; } 
public bool MoreInstructorsAllowed { get; set; } 

, 내가 같이 체크 박스를 표시하고있다 : 내 모델 클래스는 추천 속성이 있습니다. 솔루션에 미리 감사드립니다. :)

+0

http://stackoverflow.com/questions/6590663/make-checkbox -disabled-in-asp-net-mvc-2-and-jquery하지만 CheckBoxFor 대신 EditorFor를 사용하려고합니다. –

답변

3

EditorFor 확장 메서드는 모델의 유형에 해당하는 EditorTemplates 파일에있는 PartialView에 모델을 연결합니다 (이 경우에는 Boolean.cshtml이어야합니다).

편집기 템플릿에 조건부 논리를 추가하여 목표를 달성 할 수 있습니다. 또한 부분 값에 MoreInstructorsAllowed 속성의 값을 알 수있는 방법을 제공하고 additionalViewData 매개 변수가있는 EditorFor 오버로드를 사용하여이 정보를 전달할 수 있습니다.

솔직히 말해서, 부울 처리의 기본 기능을 변경하는 것이 당신이하려는 일에 조금 닮은 것 같습니다. 이 두 필드가 근본적으로 연결되어 있다면 두 필드의 합성을 만들고 부울 자체가 아닌 합성보기에 부분보기를 연결하는 것이 더 합리적입니다. 내 말은 다음과 같습니다

public class InstructorProperty { 
    public bool IsInstructor { get; set; } 
    public bool MoreInstructorsAllowed { get; set; } 
} 

에서 유일한 문제는 /Shared/EditorTemplates/InstructorProperty.cshtml

@model InstructorProperty 

// ... Your view logic w/ the @if(MoreInstructorsClause) here. 

지금 당신이 CheckboxFor 방법을 사용하는 데 문제 다시 것을 EditorFor 메서드는 특수 html 속성을 허용하지 않으므로 "disabled"속성을 적용해야합니다. ModelMetadataProvider을 무시하고 ModelMetadataProvider에서 처리를 제공하는 특성으로 특성을 꾸미는 것으로 알려진 해결 방법이 있습니다. 이 기법의 실제 예제는 http://aspadvice.com/blogs/kiran/archive/2009/11/29/Adding-html-attributes-support-for-Templates-2D00-ASP.Net-MVC-2.0-Beta_2D00_1.aspx에서 얻을 수 있습니다. 그러나 (1) 불리언보기를 무시하고 HTML을 하드 코딩하거나 거기에서 CheckboxFor를 사용하거나, 보기에서 CheckboxFor 메서드를 사용하거나, (3) HTML을 하드 코딩해야합니다. InstructorProperty보기로 이동하십시오. 내 솔루션이 InstructorProperty보기를 사용하고 단지 추가하는 것, 그래서 나는 그것이 이상 그런 사소한 일에 대한 설계를 복잡하게하는 의미가 있다고 생각하지 않습니다

@Html.CheckboxFor(_=>_.IsInstructor, 
    htmlAttributes: (Model.MoreInstructorsAllowed ? null : new { disabled = "disabled"}).ToString().ToLowerInvariant() });   

을하지만 모두가 서로 다른 스타일을 가지고 얻을 ... 하나의 다른 쪽 메모. Checkbox 메서드 사용에 대한 혐오감이 생성 된 명명 체계와 관련이있는 경우 Mvc Framework에서이 기능에 액세스하는 방식은 다음과 같습니다. html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)

+0

ChecklistFor를 사용하면 MoreInstructorsAllowed 속성이 문자열이어야합니다. disabled 속성은 true 또는 false 일 수 없으므로 비활성화 및 활성화 할 수 있습니다. –

+0

맞습니다. 나는 내 대답을 개정했다. – smartcaveman