解决metadata.HideSurroundingHtml不工作
-
27-09-2019 - |
题
我已经写了自定义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火灾。也有一些额外的逻辑被要求称为拉出右元数据。
不隶属于 StackOverflow