我有一个index.razor,它有一个for循环,可以生成100个组件(这些显示文本和更多的vlaue(,现在我想对每个组件都有一个引用,有没有办法将它们保存在列表或数组中?
我自己尝试了很多方法,但我得到了html中显示的组件名称。
addPdfComp由一个按钮执行:
public void addPdfComp(int type)
{
var newComponent = new PdfComp();
newComponent.text = "some test text";
PdfComponentsList.Add(newComponent);
}
并显示组件:
@foreach (var comp in PdfComponentsList)
{
<div>@comp</div>
}
结果:见结果
编辑:组件本身:
<div class="row p-1 " style="border:solid; ">
<h5>TextComponent</h5>
<div>
<label>X</label>
<input type="number" class="col-2" @bind-value="_x"/>
<label>Y</label>
<input type="number" class="col-2" @bind-value="_y"/>
<label>Text</label>
<input type="text" class="col-4" @bind-value="text" />
</div>
@code {
[Parameter]
public string text { get; set; } = "Missing text";
[Parameter]
public string type { get; set; } = "noone";
[Parameter]
public int _x { get; set; } = 0;
[Parameter]
public int _y { get; set; } = 0;
}
对象的默认字符串表示是该对象的完全限定类名,这就是您所看到的。这意味着无论PdfComp
是什么,它都没有一个有意义的.ToString()
实现。
这就是Razor语法在这种情况下真正做到的,它只是将输出作为字符串发出。所以@something
基本上将something
作为字符串求值,并将其写入输出。
基于以上评论:
我的意图是[…]显示组件本身,就好像我刚刚键入了100次:
<PdfComp></PdfComp>
一样。
C#代码中PdfComp
的实例与标记中<PdfComp></PdfComp>
的实例不同。(尽管我认为它们在框架深处的某个地方非常类似。(您想要的不是对象实例列表,而是视图渲染标记所需的数据列表。
因此,在结构上,更像这样:
// PdfComponentsList here is a list of strings
PdfComponentsList.Add("some test text");
然后在标记中循环显示元素:
@foreach (var pdf in PdfComponentsList)
{
<PdfComp text="@pdf"></PdfComp>
}
您也可以使PdfComponentsList
成为一个包含多个属性的对象列表,例如:
PdfComponentsList.Add(new SomeObject { Text = "some test text" });
在标记中:
@foreach (var pdf in PdfComponentsList)
{
<PdfComp text="@pdf.Text"></PdfComp>
}