Создайте 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">
Может ли кто-нибудь помочь мне? Я не могу поверить, что это так сложно построить компонент для списка / таблиц