Создайте Razor-Component со списком<dynamic> для отправки в разные списки

Я создаю Razor-компонент в Asp.NET CORE 2.2 из шаблона M$ "StarterViewComp", который должен иметь возможность использовать различные типы List и использовать TagHelpers или asp-for для генерации элементов управления по правильному типу.

В связи с реализацией списка типов моделей я до сих пор не могу архивировать это на Property-lvl

(Sample1) Используя @Html.EditorFor и передав полную запись динамического списка, я получил именно то, что хочу, с тем недостатком, что я не могу структурировать вывод, установить CSS, добавить значки по строковому значению и так далее....

нет "контроля", но отличный результат

(Sample2) На второй попытке я использовал отражение, чтобы прочитать каждое свойство и получить контроль, результат не так уж плох, но вот некоторые новые недостатки

При использовании @Html.Editor(refleProperty.Name) счетчик / привязка элемента списка теряется (элемент 0/1/2/3...) И тип не распознается, поэтому я всегда получаю текстовое поле для всех типы кода. в-третьих, ЗНАЧЕНИЕ не установлено, мне нужно было передать значение с помощью javaScript. Доступны другие данные, например, требуемые.

Я попытался улучшить этот код, используя @Html.Checkbox в ближайшее время, используя соответствующий тип, но в этих выходных данных я теряю даже БОЛЬШЕ связывания, как требуется, или подтверждение данных

(Sample3) Итак, новый день, новая идея - я пробую это.NET Core, как в шаблонах M $ с <input asp-for="@Model.Some">

но у меня сегодня не было никакого успеха, чтобы построить "хорошо" результат

Я дополнительно добавляю "item" значение typ для проверки хорошего вывода.

(Sample1) Вывести то, что я хочу, но без управления структурой:

@model List<dynamic>
    <ul>
        @for (int i = 0; i < Model.Count(); i++)
        {            
            <li style="margin-bottom: 20px;">
                @*<div><b>@Html.DisplayFor(modelItem => Model[i])</b></div>
                <hr />*@
                <div>@Html.EditorFor(modelItem => Model[i])</div>
            </li>
        }
    </ul>

(Sample2) Способ отражения с такими проблемами, как свободный контроль типа и модели [index]

@model List<dynamic>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"
        integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
        crossorigin="anonymous"></script>

@{
    Type type = null;
    if (Model.Count() > 0)
    {
        type = Model[0].GetType();
        System.Reflection.PropertyInfo[] propertys = type.GetProperties();

        foreach (System.Reflection.PropertyInfo property in propertys)
        {
            <div>
                @property.Name: @property.GetValue(Model[0], null)
            </div>
            <div>
                @Html.Editor(property.Name, "", property.Name, Model[0])
                <script>
                    var elemName = '@property.Name';
                    var elemValue = '@property.GetValue(Model[0], null)';
                    $('#' + elemName).val(elemValue);
                </script>
            </div>


            <div>
                @{
                    var checkThis = property.PropertyType.Name.ToString();
                }
                @switch (checkThis)
                {
                    case "Boolean":
                        @Html.CheckBox(property.Name, property.GetValue(Model[0], null))
                        break;
                    default:
                        @Html.TextBox(property.Name, property.GetValue(Model[0], null))
                        break;
                }
            </div>
        }
    }
}

(Sample3) Современный способ, безуспешный до сих пор, с примером в качестве "элемента".

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model List<dynamic>
@{
    ViewComponentSample.Models.TodoItem[] item = new  [] {
        new ViewComponentSample.Models.TodoItem() { }
    };
}

<h1>1</h1>
@{
    Type type = null;
    if (Model.Count() > 0)
    {
        dynamic o = Model[0];
        type = o.GetType();
        System.Reflection.PropertyInfo[] propertys = type.GetProperties();

        foreach (System.Reflection.PropertyInfo property in propertys)
        {            
            <div>                }
                <label asp-for="@property.Name" class="control-label"></label>
                <input asp-for="@property.Name" class="form-control" />
                <span asp-validation-for="@property.Name" class="text-danger"></span>
            </div>
        }
    }
}

<h1>3</h1>



<form>
    <label asp-for="@item[0].Id" class="control-label"></label>
    <input asp-for="@item[0].Id" class="form-control" />
    <span asp-validation-for="@item[0].Id" class="text-danger"></span>

    <label asp-for="@item[0].Priority" class="control-label"></label>
    <input asp-for="@item[0].Priority" class="form-control" />
    <span asp-validation-for="@item[0].Priority" class="text-danger"></span>

    <label asp-for="@item[0].IsDone" class="control-label"></label>
    <input asp-for="@item[0].IsDone" class="form-control" />
    <span asp-validation-for="@item[0].IsDone" class="text-danger"></span>
</form>

Вот что я могу исследовать в DOM REFLECTION CODERTY CODE

<input class="text-box single-line" data-val="true" data-val-required="The Int32 field is required." id="Id" name="Id" type="text" value="">

ОЖИДАЕТСЯ

<input class="text-box single-line" data-val="true" data-val-required="The Id field is required." id="z0__Id" name="[0].Id" type="number" value="2">

Может ли кто-нибудь помочь мне? Я не могу поверить, что это так сложно построить компонент для списка / таблиц

0 ответов

Другие вопросы по тегам