Решение метаданных. HideSurroundingHtml не работает - PullRequest
1 голос
/ 14 июня 2010

Я написал собственный DataAnnotationsModelMetadataProvider, который динамически устанавливает 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 создал новый метод расширения HTML для метки, который пытается заставить HideSurroundingHtml работать.

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 - который объясняет, почему это не работает, но тот факт, что он вызывается в этом порядке, не имеет смысла.

Может кто-нибудь объяснить это?или как добиться того, чего я пытаюсь достичь?

1 Ответ

1 голос
/ 15 июня 2010

Вот как это сделать:

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.Также потребовалась дополнительная логика, чтобы вызывать нужные метаданные.

...