2010-06-14 4 views
1

HideSurroundingHtml을 동적으로 설정하는 사용자 정의 DataAnnotationsModelMetadataProvider를 작성했습니다.메타 데이터에 대한 솔루션 .HideSurroundingHtml 작동하지 않음

public class ContentDrivenModelMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 

     protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, 
                 Func<object> modelAccessor, Type modelType, string propertyName) 
     { 
      ModelMetadata metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, 
                 propertyName); 

      metadata.HideSurroundingHtml = true; 
     } 

} 

그러나 이것은 편집기 템플릿에 의해 선택되지 않은 것 같습니다. 그래서 Iv는 HideSurroundingHtml을 강제로 작동 시키려고하는 레이블을 위해 새로운 HTML 확장 메소드를 만들었습니다. 나는이에 브레이크 포인트를 부착 할 때

public static class HtmlCustom 
    { 
     public static MvcHtmlString CustomLabelFor<TModel, TProperty>(
       this HtmlHelper<TModel> htmlHelper, 
       Expression<Func<TModel, TProperty>> expression) 
     { 
      if(htmlHelper.ViewData.ModelMetadata.HideSurroundingHtml) 
      { 
       return MvcHtmlString.Empty; 
      } 

      return htmlHelper.LabelFor(expression); 
     } 
    } 

그러나 이것은 어떤 일을하지 않습니다는, 또한, CreateMetadata 방법 전에 확장 메서드 칠 것 -이 작동하지 않는 이유를 설명하지만, 사실이 그것을 호출한다 이 순서는 의미가 없습니다.

아무도 설명 할 수 있습니까? 또는 달성하려는 무엇을 달성하는 방법? 이

public static MvcHtmlString CustomLabelFor<TModel, TProperty>(
       this HtmlHelper<TModel> htmlHelper, 
       Expression<Func<TModel, TProperty>> expression) 
     { 
      var propertyName = ExpressionHelper.GetExpressionText(expression); 
      var htmlString = htmlHelper.LabelFor(expression); 

      ModelMetadata modelMetaData = htmlHelper.ViewData.ModelMetadata.Properties.Where(x => x.PropertyName == propertyName).First(); 

      if (modelMetaData.HideSurroundingHtml) 
      { 
       htmlString = MvcHtmlString.Empty; 
      } 
      return htmlString; 
     } 

을 문제의 몇 가지, 그것은 CreateMetadata 화재를 유발이 그대로 방법의 시작 htmlHelper.LabelFor를 이동했다 여기서 여기

+0

이전 게시물이지만 맞춤 메타 데이터 공급자를 첨부했는지 기억해 둡니까? 'Application_Start' 메쏘드에 다음과 같은 것이 필요합니다 :'ModelMetadataProviders.Current == new ToolboxModelMetadataProvider()'. 사용자 지정 메타 데이터 공급자가 실제로 호출되는지 확인할 수 있는지 여부는 언급하지 않습니다. – TLS

답변

1

그것을 수행하는 방법이다. 또한 올바른 메타 데이터를 가져 오기 위해 몇 가지 추가 논리가 필요했습니다.

관련 문제