元数据的解决方案.HideSurroundingHtml无法正常工作

时间:2010-06-14 16:35:14

标签: asp.net-mvc-2 modelmetadata

我编写了一个自定义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 个答案:

答案 0 :(得分: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触发。还需要一些额外的逻辑来调用拉出正确的元数据。