您应该能够使用模板化组件来完成此操作。
文本框.razor
@typeparam inputType
<div class="textbox">
@if(LabelTemplate!=null && TItem!=null)
@LabelTemplate(TItem)
<input type="text"/>
</div>
@code{
[Parameter]
public RenderFragment<inputType> LabelTemplate { get; set; }
[Parameter]
public inputType TItem { get; set; }
}
在上面的代码中,您指定组件接受一个类型,使用@typeparam inputType
并接收该类型的对象作为参数TItem
。
您还接受 a LabelTemplate
,它接受 type 的对象inputType
。为了渲染这个片段,我们调用@LabelTemplate
并传入我们的TItem
参数。
现在让我们看看如何在一个名为 PersonForm.razor 的新组件中使用我们的模板化组件
PersonForm.razor
<Textbox TItem="myPerson">
<LabelTemplate>
@context.Name
</LabelTemplate>
</Textbox>
<Textbox TItem="myPerson">
<LabelTemplate>
@context.PhoneNumber
</LabelTemplate>
</Textbox>
@code{
Person myPerson = new Person { Name = "Jane Doe", PhoneNumber = "999 999 9999" };
public class Person
{
public string Name { get; set; }
public string PhoneNumber { get; set; }
}
}
我将我的 Person 对象传递给每个 Textbox 组件的 TItem 属性,并使用@context
语法在 LabelTemplate 中访问它。
起初这可能看起来令人困惑,所以请在此处阅读
编辑
它只是取决于你想要完成什么。Verbose 语法在组件的“实现”方面带来了灵活性。不是强制一个可能不适用于各种模型/类的接口,而是让实现指定要做什么。
如果您想要一些不那么冗长/更严格的东西,您也可以执行以下操作。
@implements ILabel
<div class="textbox">
<label>@Text</label>
<input type="text"/>
</div>
@code
{
[Parameter]
public string Text { get; set; }
}
ILabel.cs
public interface ILabel
{
string Text { get; set; }
}