У меня есть компонент Razor, который я перетаскиваю на страницу Razor следующим образом:
<component type="typeof(ElementProductComponent)"
render-mode="Server"
param-elementList="Model.elementList" />
Я передаю список (elementList) в компонент в качестве параметра.
Список объявлен в коде страницы бритвы как
[BindProperty]
public List<ElementModel> elementList { get; set; }
ElementModel - базовый класс. Список обычно содержит элементы различных типов, производные от базового класса (ElementTextModel, ElementDateModel и т. Д. c)
В кодовой привязке для страницы бритвы список заполняется следующим образом:
public async Task<IActionResult> OnGet(string id)
{
elementList = GetList();
return Page();
}
public static List<ElementModel> GetList()
{
var elements = new List<ElementModel>();
elements.Add(new ElementTextModel { Name = "TestTextName", Value = "hello world" });
elements.Add(new ElementDateModel { Name = "TestDateName", Value = "20200101" });
return elements;
}
Модели выглядят так:
public class ElementModel
{
[Required]
public string Name { get; set; }
[Required]
public virtual ElementType Type { get; }
}
public class ElementTextModel : ElementModel
{
[Required]
public string Value { get; set; }
public Hashtable Attributes { get; set; }
[Required]
public override ElementType Type { get { return ElementType.TEXT; } }
}
Затем в моем компоненте я хочу перебрать список и отобразить различные html, дочерние компоненты, основанные на типе каждого элемента в списке. Я могу сделать это с помощью переключателя или если. Вот упрощенная версия кода, где я просто пытаюсь отобразить тип, который вижу.
<div>
Elements:
<ul>
@for (var i = 0; i < elementList.Count; i++)
{
<li>
<div>@elementList[i].Type</div>
<div>@elementList[i].Name</div>
</li>
}
</ul>
</div>
@code {
[Parameter]
public List<ElementModel> elementList { get; set; }
}
Проблема в том, что когда я объявляю компонент как
<component type="typeof(ElementProductComponent)"
render-mode="Server"
param-elementList="Model.elementList" />
с в режиме рендеринга, установленном на Server, код в компоненте видит элементы в elementList с типом ElementModel, независимо от того, как они были объявлены. Это не правильно.
если я сделаю это:
<component type="typeof(ElementProductComponent)"
render-mode="Static"
param-elementList="Model.elementList" />
и установлю режим рендеринга на Stati c, компонент увидит список правильно, как смешанный список элементы типов, производных от базового класса.
Почему это происходит? Это ошибка или проблема в конфигурации?