NetCore InputTagHelper с использованием отражения - PullRequest
1 голос
/ 18 июня 2020

У меня есть модель с множеством свойств. Создание или обновление их представлений - хлопотная работа.

Итак, я пытаюсь использовать Reflection для создания представления во время выполнения: (PS: да, я знаю, что интерфейс очень важен, я должен использовать Vue или другой фрейм для создания представлений во время разработки. Но я просто хочу попробовать создавать формы во время выполнения, да, я урод. LOL)

Вот мой код:

@{
    var dic = Model.GetAttributePropsByCategory();// get PropertyInfo by CategoryAttribute and custom DisplayIndexAttribute
}
@foreach (var items in dic)
{
    var category = items.Key; //  InfoCategoryAttribute
    foreach (var tuple in items.Value)
    {
        var displayIndex = tuple.Item1; // Custom: DisplayIndexAttribute
        var prop = tuple.Item2; // PropertyInfo

        <input asp-for="@prop.Name" class="form-control"/>
    }
}

Моя цель - :

<input class="form-control valid" type="text" data-val="true" data-val-required="The VIN field is required." id="VIN" name="VIN" value="VIN001" aria-describedby="VIN-error" aria-invalid="false">

Но результат такой:

<input class="form-control valid" type="text" data-val="true" data-val-required="The Name field is required." id="prop_Name" name="prop.Name" aria-describedby="prop_Name-error" aria-invalid="false">

Итак, я прочитал исходный код в aspnetcore. mvc .taghelpers . Я обнаружил, что ключ - InputTagHelper.For:

public class InputTagHelper : TagHelper
{
    ...

    [HtmlAttributeName(ForAttributeName)]
    public ModelExpression For { get; set; }

    ...
}

Но я не могу понять, как был создан InputTagHelper.For. Поэтому я не знаю, как отменить его для достижения моей цели.

Есть ли какие-нибудь предложения? Спасибо.

1 Ответ

1 голос
/ 19 июня 2020

В исходном коде InputTagHelper , мы можем найти следующий фрагмент кода, который поможет сгенерировать ввод текстового поля, а третий параметр For.Name будет использоваться для установки значений текстового поля id и name атрибут.

return Generator.GenerateTextBox(
    ViewContext,
    modelExplorer,
    For.Name,
    modelExplorer.Model,
    format,
    htmlAttributes);

И если мы отладим исходный код, мы найдем значение For, как показано ниже.

enter image description here

Для достижения ожидаемого результата вы можете настроить его и передать For.Model.ToString() методу GenerateTextBox, а не For.Name, как показано ниже.

return Generator.GenerateTextBox(
    ViewContext,
    modelExplorer,
    //For.Name,
    For.Model.ToString(),
    modelExplorer.Model,
    format,
    htmlAttributes);

Результат теста

enter image description here

...