Таблица TagHelper для модели IEnumerable (без использования Reflection) - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь создать помощник по тегу таблицы, который может автоматически анализировать столбцы и строки из заданной модели.

Вот как это (теоретически использовать):

<table for="@Model">

</table>

и это должно автоматически показывать имена столбцов и строки.

Создание имен столбцов не было так сложно, так как я передаю модель

[HtmlTargetElement("table", Attributes = "for")]
public class DataTableTagHelper :TagHelper
{
    [HtmlAttributeName("for")]
    public ModelExpression For { get; set; }

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        foreach (var item in For.Metadata.ElementMetadata.Properties)
        {
            // generate html for theader using item.Name
        }
    }
}

Но получить значения модели не так просто.

Есть ли способ получить значения этих свойств?

Я пытаюсь избежать рефлексии, потому что я не думаю, что генерировать HTML-код, хотя рефлексия с каждым запросом - хорошая идея.

1 Ответ

0 голосов
/ 25 августа 2018

Мы получаем значение свойства, передавая модель его PropertyGetter.

.
public override void Process(TagHelperContext context, TagHelperOutput output)
{
    foreach (var prop in For.Metadata.Properties)
    {
        var propertyName = prop.Name;
        var propertyValue = prop.PropertyGetter(For.Model);
    }

    return Task.CompletedTask;
}

Если модель реализует IEnumerable, то нам нужно передать каждый элемент в PropertyGetter.

public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
    foreach (var item in For.Model as IEnumerable)
    {
        foreach (var prop in For.Metadata.ElementMetadata.Properties)
        {
            var name = prop.Name;
            var value = prop.PropertyGetter(item);
        }
    }

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