2010-06-14 14 views
1

J'ai écrit un DataAnnotationsModelMetadataProvider personnalisé qui définit HideSurroundingHtml dynamiquement.Solution à metadata.HideSurroundingHtml ne fonctionne pas

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

} 

Mais cela ne semble pas être pris en compte par les modèles d'éditeur. Donc Iv a créé une nouvelle méthode d'extension HTML pour l'étiquette qui essaie de forcer HideSurroundingHtml à fonctionner.

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

Mais cela ne travaille pas, par ailleurs, quand j'attachais points de rupture à ceux-ci, il semble frapper la méthode d'extension avant que la méthode CreateMetadata - ce qui explique pourquoi cela ne fonctionne pas, mais le fait cela, il est appelé à cet ordre n'a pas de sens.

Quelqu'un peut-il expliquer cela? ou comment réaliser ce que j'essaie de réaliser?

+0

Ceci est un article plus ancien, mais avez-vous pensé à joindre votre fournisseur de métadonnées personnalisé? Vous aurez besoin de quelque chose comme ça dans votre méthode 'Application_Start':' ModelMetadataProviders.Current == new ToolboxModelMetadataProvider() '. Vous ne mentionnez pas si vous pouvez vérifier que votre fournisseur de métadonnées personnalisé est effectivement appelé. – TLS

Répondre

1

Voici comment faire:

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

Là où deux ou trois questions, a dû se déplacer htmlHelper.LabelFor au début de la méthode car il est ce qui provoque CreateMetadata au feu. Aussi une certaine logique supplémentaire était nécessaire pour appeler les bonnes méta-données.