Я создаю 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