1

HideSurroundingHtml を動的に設定するカスタム DataAnnotationsModelMetadataProvider を作成しました。

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 は、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 メソッドの前に拡張メソッドにヒットしたように見えます。これは、これが機能しない理由を説明していますが、この順序で呼び出されるという事実は意味がありません。

誰でもこれを説明できますか?または、私が達成しようとしていることを達成する方法は?

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;
        }

CreateMetadata が発生する原因となるため、いくつかの問題があり、htmlHelper.LabelFor をメソッドの先頭に移動する必要がありました。また、適切なメタデータを引き出すために、追加のロジックが必要でした。

于 2010-06-15T11:05:30.620 に答える