1

我编写了一个自定义的 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 方法之前命中了扩展方法 - 这解释了为什么这不起作用,但按此顺序调用它的事实没有意义。

任何人都可以解释这一点吗?或者如何实现我想要实现的目标?

4

1 回答 1

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 触发。还需要一些额外的逻辑来调用正确的元数据。

于 2010-06-15T11:05:30.620 回答