MVC3: вызов строго типизированного помощника из пользовательского помощника с помощью динамического доступа к полю - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть строго типизированный пользовательский помощник (он ничего не делает - просто пример):

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

1 Ответ

0 голосов
/ 13 декабря 2011

Хорошо, я просто вернул

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

для свойств без использования DisplayFor.Но больше фанов началось с вложенных классов и списков ..; -)

В любом случае, я решил свою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...