Создайте Razor-Component со списком <dynamic>для отправки в разные списки - PullRequest
0 голосов
/ 03 июля 2019

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

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

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

нет "контроль", но отличный вывод

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

При использовании @ Html.Editor (refleProperty).Name) счетчик / привязка элемента списка теряется (элемент 0/1/2/3 ...) И тип не распознается, поэтому я всегда получаю текстовое поле для всех типов кода.в-третьих, значение VALUE не установлено, мне нужно было передать значение с помощью 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) Современный способ, без успехадо сих пор должен быть пример как "item"

@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 PROPERTY 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="">

EXPECTED

<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">

Может кто-тоПомогите мне, пожалуйста?Я не могу поверить, что так сложно создать компонент для List / Tables

...