MVC3:通过动态字段访问从自定义帮助程序调用强类型帮助程序

时间:2011-12-12 12:36:13

标签: asp.net-mvc-3 strongly-typed-helper

我有强类型的自定义助手(它什么都不做 - 只是样本):

public static MvcHtmlString MyDisplayFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression
{
    return DisplayExtensions.DisplayFor(htmlHelper, model => metadata.Model);
}

它工作得很好,但是我想要一个make storngly类型的帮助器,里面有强类型的帮助器,用于Model的每个属性

public static MvcHtmlString MyOtherFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, IList<TProperty>>> expression)
{
    ModelMetadata dataModelMetadata = ModelMetadata.FromLambdaExpression<TModel, IList<TProperty>>(expression, htmlHelper.ViewData);
    IList<TProperty> modelData = (IList<TProperty>)dataModelMetadata.Model; 
    IEnumerable<ModelMetadata> headModelMetadatas = (new DataAnnotationsModelMetadataProvider()).GetMetadataForProperties(dataModelMetadata.Model, typeof(TProperty))


     foreach (var singleData in modelData)
     {
     StringBuilder sb = new StringBuilder();
         foreach(var headModelMetadata in headModelMetadatas)
         {
             sb.Append(
                 DisplayExtensions.DisplayFor(htmlHelper, m => singleData ) //this gives me all fields displayed by DisplayFor and I want to access single one per call
                 .ToHtmlString());
         }
     }

}

正如我在评论中提到的,我想要附加单个字段(这个附加很简单,还有一些隐藏的代码,我只是为了使它更干净而切割)所以我试着在时间上得到一个字段:

DisplayExtensions.DisplayFor(htmlHelper, m => singleData.GetType().GetProperty(headModelMetadata.PropertyName))

但这给了我一个错误。 任何其他好主意,解决它? ; - )

编辑:

我做了一些尝试并且:

DisplayExtensions.DisplayFor(htmlHelper, m => singleData.GetType().GetProperty(headModelMetadata.PropertyName).GetValue(singleData, null)) still gives an error

但:

object oValue = singleData.GetType().GetProperty(headModelMetadata.PropertyName).GetValue(singleData, null);
DisplayExtensions.DisplayFor(htmlHelper, m => oValue)

作品!几乎和我预期的一样..它返回属性的每个属性的显示。看看DateTime的样本;-)。需要更多帮助。

示例,适用于DateTime:

Day
1
DayOfWeek
Thursday
DayOfYear
335
Hour
0
Kind
Unspecified
Millisecond
0
Minute
0
Month
12
Second
0
Ticks
634582944000000000
TimeOfDay
00:00:00
Year
2011

1 个答案:

答案 0 :(得分:0)

好的,我只是简单地回来了

    MvcHtmlString.Create(oValue.ToString()).toHtmlString();

对于不使用DisplayFor的属性。但更多的phun从嵌套类和列表开始..; - )

无论如何我解决了我的问题。