我已经写了自定义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;
        }

}

但是,这并不似乎被编辑模板被拾起。所以㈣创建的标签,试图迫使HideSurroundingHtml工作一个新的HTML扩展方法。

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方法之前扩展方法 - 这也解释了为什么这是行不通的,但其实这是被称为顺序不有意义。

任何一个可以解释?或如何实现什么即时试图实现?

有帮助吗?

解决方案

下面是如何做到这一点:

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火灾。也有一些额外的逻辑被要求称为拉出右元数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top