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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top