Razor Components (Blazor) - режим рендеринга, влияющий на списки производных классов - PullRequest
1 голос
/ 14 февраля 2020

У меня есть компонент 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, компонент увидит список правильно, как смешанный список элементы типов, производных от базового класса.

Почему это происходит? Это ошибка или проблема в конфигурации?

...