我有一个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" />
并将渲染模式设置为“静态”,组件可以正确地看到列表,它是从基类派生的类型项的混合列表。
为什么会这样?这是一个错误还是有一些配置问题在起作用?