![](/img/trans.png)
[英]How to get part of model expression points to in strongly typed HtmlHelper extension
[英]HtmlHelper generic reflection - get metadata for non-model based expression
我有一个基于模型的DescriptionFor
助手,如下所示:
public static HtmlString DescriptionFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression) where TModel : class
{
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
return new HtmlString(metaData.Description.ToStringOrEmpty());
}
这将关闭DataAnnotations.DisplayAttribute
(特别是Description
参数),并且可以正常工作。
我现在有一个案例,其中我的模型有一个我正在遍历的IEnumerable<foo>
,而foo
有一个枚举,其中每个枚举成员都带有DisplayAttribute
。 大多数(但不是全部) DisplayAttribute
属性提供了Description
属性,我想在我的循环中公开它,如下所示:
@foreach(var fooObject in Model.foos){
@Html.Description(fooObject, x=>x.fooEnumVal)
}
...这将显示每个foo
对象的枚举值描述。
我很快发现它与模型助手不是很相似。 有人可以为此指出正确的方向吗?
您可以使用for循环而不是foreach并与您的助手一起获取描述
@for(int i =0; i < Model.foos.Count(); i++){
@Html.Description(x => x.foos[i].fooEnumVal)
}
您也可以创建新的帮助程序方法,该方法将为指定的模型创建新的viewdatadictionary并获取属性的元数据(我没有检查过,但是应该可以使用:))
public static HtmlString DescriptionFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, TModel model, Expression<Func<TModel, TProperty>> expression)
where TModel : class
{
var metaData = ModelMetadata.FromLambdaExpression(expression, new ViewDataDictionary<TModel>(model));
return new HtmlString(metaData.Description.ToStringOrEmpty());
}
希望能帮助到你
我最终做了这样的事情:
public static HtmlString DescriptionFor(this Enum theEnum)
{
var theEnumType = theEnum.GetType();
//the enum must inherit from Enum, but not actually *be* Enum.
if (!(theEnum is Enum) || theEnumType.Equals(typeof(Enum))) throw new ArgumentException("Not a valid Enumeration.");
var fi = theEnumType.GetField(theEnum.ToString());
var displayAttribute = ((DisplayAttribute[])fi.GetCustomAttributes(typeof(DisplayAttribute), false))
.FirstOrDefault();
if (displayAttribute == null) return new HtmlString(theEnum.ToString());
return new HtmlString(displayAttribute.Description ?? theEnum.ToString());
}
我敢肯定这不是最好的方法,但是我认为我可以有效地写:
@fooObject.enumVal.DescriptionFor()
表现如我所愿。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.