Asp.net mvc 2 metadata.hidesUroundingTML不工作的解决方案
我已经编写了一个自定义DataAnnotationsModelMetadataProvider,它动态地设置HidesUroundingTMLAsp.net mvc 2 metadata.hidesUroundingTML不工作的解决方案,asp.net-mvc-2,modelmetadata,Asp.net Mvc 2,Modelmetadata,我已经编写了一个自定义DataAnnotationsModelMetadataProvider,它动态地设置HidesUroundingTML public class ContentDrivenModelMetadataProvider : DataAnnotationsModelMetadataProvider { protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> att
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;
}
}
公共类ContentDrivenModelMetadataProvider:DataAnnotationsModelMetadataProvider
{
受保护的重写ModelMetadata CreateMatadata(IEnumerable属性,类型containerType,
Func modelAccessor,类型modelType,字符串propertyName)
{
ModelMetadata metadata=base.CreateMetadata(属性、containerType、modelAccessor、modelType、,
属性名称);
metadata.hidesurroundingtml=true;
}
}
但编辑器模板似乎没有注意到这一点。因此,Iv为标签创建了一个新的HTML扩展方法,试图强制HidesUroundingTML工作
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);
}
}
公共静态类HtmlCustom
{
公共静态MvcHtmlString CustomLabelFor(
这个HtmlHelper HtmlHelper,
表达式(表达式)
{
if(htmlHelper.ViewData.ModelMetadata.HidesUroundingTML)
{
返回MvcHtmlString.Empty;
}
返回htmlHelper.LabelFor(表达式);
}
}
但这不起作用,而且,当我将断点附加到这些断点时,它似乎在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;
}
publicstaticmvchtmlstring自定义标签(
这个HtmlHelper HtmlHelper,
表达式(表达式)
{
var propertyName=ExpressionHelper.GetExpressionText(表达式);
var htmlString=htmlHelper.LabelFor(表达式);
ModelMetadata ModelMetadata=htmlHelper.ViewData.ModelMetadata.Properties.Where(x=>x.PropertyName==PropertyName).First();
if(modelMetaData.hidesurroundingtml)
{
htmlString=MvcHtmlString.Empty;
}
返回htmlString;
}
这里有几个问题,必须将htmlHelper.LabelFor移到方法的开头,因为正是这一点导致CreateMatadata触发。此外,还需要一些额外的逻辑来调用拉出正确的元数据。以下是如何操作:
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;
}
publicstaticmvchtmlstring自定义标签(
这个HtmlHelper HtmlHelper,
表达式(表达式)
{
var propertyName=ExpressionHelper.GetExpressionText(表达式);
var htmlString=htmlHelper.LabelFor(表达式);
ModelMetadata ModelMetadata=htmlHelper.ViewData.ModelMetadata.Properties.Where(x=>x.PropertyName==PropertyName).First();
if(modelMetaData.hidesurroundingtml)
{
htmlString=MvcHtmlString.Empty;
}
返回htmlString;
}
这里有几个问题,必须将htmlHelper.LabelFor移到方法的开头,因为正是这一点导致CreateMatadata触发。此外,还需要一些额外的逻辑来调用拉出正确的元数据。这是一篇较旧的帖子,但您是否记得附加自定义元数据提供程序?在
应用程序\u Start
方法中需要类似的内容:modelmataproviders.Current==newtoolboxmodelmataprovider()
。您没有提到是否可以验证您的自定义元数据提供程序是否实际被调用。这是一篇较旧的文章,但您是否记得附加自定义元数据提供程序?在应用程序\u Start
方法中需要类似的内容:modelmataproviders.Current==newtoolboxmodelmataprovider()
。您没有提到是否可以验证您的自定义元数据提供程序是否实际被调用。