我编写了一个自定义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方法之前点击了扩展方法 - 这解释了为什么这不起作用,但事实上它按此顺序调用不会有道理。
任何人都可以解释一下吗?或者如何实现我想要实现的目标?
答案 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触发。还需要一些额外的逻辑来调用拉出正确的元数据。