剃刀组件(Blazor)-渲染模式影响派生类的列表

时间:2020-02-13 21:30:51

标签: asp.net-core razor blazor

我有一个Razor组件,我正在像这样放置到Razor页面上:

<component type="typeof(ElementProductComponent)"
render-mode="Server"
param-elementList="Model.elementList" />

我正在将列表(elementList)作为参数传递给组件。

列表在剃刀页面代码中声明为

 [BindProperty]    
public List<ElementModel> elementList { get; set; }

ElementModel是基类。该列表通常包含从基类派生的各种类型的项(ElementTextModel,ElementDateModel等)

在剃须刀页面的代码绑定中,列表是这样填充的:

 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类型的elementList中的项目。这是不正确的。

如果我这样做:

<component type="typeof(ElementProductComponent)"
render-mode="Static"
param-elementList="Model.elementList" />

并将渲染模式设置为“静态”,组件可以正确地看到列表,它是从基类派生的类型项的混合列表。

为什么会这样?这是一个错误还是有一些配置问题在起作用?

0 个答案:

没有答案