2010-06-14 63 views
1

我寫了一個自定義DataAnnotationsModelMetadataProvider,它可以動態設置HideSurroundingHtml。解決方案metadata.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方法之前擴展方法 - 這也解釋了爲什麼這是行不通的,但其實這是被稱爲在這個命令沒有意義。

任何人都可以解釋這一點嗎?或者如何實現我試圖實現的目標?

+0

這是一個較舊的帖子,但您是否記得附上您的自定義元數據提供程序?在Application_Start方法中你需要這樣的東西:ModelMetadataProviders.Current == new ToolboxModelMetadataProvider()。您沒有提及您是否可以驗證您的自定義元數據提供程序是否實際被調用。 – TLS 2011-02-25 18:24:16

回答

1

這裏是如何做到這一點:

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; 
     } 

其中有一對夫婦的問題,只好搬到htmlHelper.LabelFor該方法的開始,因爲它是這導致CreateMetadata火。還需要一些額外的邏輯來調用拉出正確的元數據。

相關問題