HideSurroundingHtml을 동적으로 설정하는 사용자 정의 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는 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;
}
을 문제의 몇 가지, 그것은 CreateMetadata 화재를 유발이 그대로 방법의 시작 htmlHelper.LabelFor를 이동했다 여기서 여기
이전 게시물이지만 맞춤 메타 데이터 공급자를 첨부했는지 기억해 둡니까? 'Application_Start' 메쏘드에 다음과 같은 것이 필요합니다 :'ModelMetadataProviders.Current == new ToolboxModelMetadataProvider()'. 사용자 지정 메타 데이터 공급자가 실제로 호출되는지 확인할 수 있는지 여부는 언급하지 않습니다. – TLS