Как использовать asp-для TagHelper в сочетании с Reflection - PullRequest
1 голос
/ 26 сентября 2019

У меня есть класс Foo , который содержит много свойств, я хотел бы перебрать все из них в форму.Сайт построен с использованием ASP.NET Core 2.2 и Razor.

Как я могу построить MemberExpression, которое asp-для TagHelper, по-видимому, ожидает с помощью Reflection?Я прочитал несколько постов об этом на форуме, но ни один из ответов не соответствует моим потребностям.

Следующий фрагмент не работает.

@model Foo;
<h1>Foo Reflective filling example</h1>

    @foreach(var property in typeof(Foo).GetProperties()) {
        <p>
            <div class="row">
                <div class="col-md-3">
                    <label asp-for="@property.Name"></label> @*doesn't work!'*@
                </div>
                <div class="col-md-3">
                    <input asp-for="@property.Name" class="form-control" id="property.Name"/>
                    <span asp-validation-for="@property.Name" class="text-danger"></span>
                </div>
            </div>
        </p>
    }

Спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

InputTagHelper помогает нам писать код в стиле декларативного программирования.Если вам трудно динамически визуализировать различные поля с помощью отражения, не стесняйтесь использовать @Html.Xyz эквивалент программным способом .

Ваш код можно переписатькак показано ниже:

@foreach(var property in typeof(Foo).GetProperties()) {
    <p>
        <div class="row" >
            <div class="col-md-3">
                @Html.Label(@property.Name)
            </div>
            <div class="col-md-3">
                @Html.Editor(@property.Name,  new { htmlAttributes = new{ @class="form-control" } })
                @Html.ValidationMessage(@property.Name, new { htmlAttributes = new { @class="text-danger"} })
            </div>
        </div>
    </p>
}

Демонстрация:

Я создаю пользовательское Foo DTO, как показано ниже:

public class Foo{
    public int Id {get;set;}
    public string Name {get;set;}
    public string Address {get;set;}
    public DateTime UpdatedAt{get;set;}
}

И отображается форма:

enter image description here

0 голосов
/ 26 сентября 2019

Щелкните правой кнопкой мыши решение -> Добавить -> Новая папка (Модели)

Щелкните правой кнопкой мыши папку «Модели» -> Добавить -> Класс (Foo)

Класс Foo:

public class Foo
{
    public int A { get; set; }
    public string B { get; set; }
}

Файл Index.cshtml:

@foreach (var property in typeof(YourProjectName.Models.Foo).GetProperties())
{
    <p>
        <div class="row">
            <div class="col-md-3">
                <label asp-for="@property.Name"></label>
            </div>
            <div class="col-md-3">
                <input asp-for="@property.Name" class="form-control" id="property.Name" />
                <span asp-validation-for="@property.Name" class="text-danger"></span>
            </div>
        </div>
    </p>
}

Результат:

<body>
    <p>
        <div class="row">
            <div class="col-md-3">
                <label asp-for="A"></label> 
            </div>
            <div class="col-md-3">
                <input class="form-control" id="property.Name" asp-for="A">
                <span class="text-danger" asp-validation-for="A"></span>
            </div>
        </div>
    <p></p>
    <p>
        <div class="row">
            <div class="col-md-3">
                <label asp-for="B"></label> 
            </div>
            <div class="col-md-3">
                <input class="form-control" id="property.Name" asp-for="B">
                <span class="text-danger" asp-validation-for="B"></span>
            </div>
        </div>
    <p></p>
</body>
...