Solution à metadata.HideSurroundingHtml ne fonctionne pas
-
27-09-2019 - |
Question
Je l'ai écrit un DataAnnotationsModelMetadataProvider personnalisé ensembles HideSurroundingHtml dynamiquement.
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 semblait être repris par les modèles de l'éditeur. Ainsi, Iv a créé une nouvelle méthode d'extension HTML pour l'étiquette qui tente de forcer HideSurroundingHtml au travail.
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é dans cet ordre ne sens.
Quelqu'un peut-il expliquer cela? ou comment réaliser ce que im essayant d'atteindre?
La solution
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 logique supplémentaire a été nécessaire pour tirer appelé les données méta droite.