2010-06-14 67 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火。还需要一些额外的逻辑来调用拉出正确的元数据。

相关问题