У меня есть строго типизированный пользовательский помощник (он ничего не делает - просто пример):
public static MvcHtmlString MyDisplayFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression
{
return DisplayExtensions.DisplayFor(htmlHelper, model => metadata.Model);
}
Это прекрасно работает, но я хочу сделать помощника строго типизированного типа со строго типизированными помощниками внутри для каждого свойства 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