在 Blazor 组件中,您可以创建一个通用参数以在方法中使用,就像在典型的 C# 类中一样。为此,语法是:
@typeparam T
Run Code Online (Sandbox Code Playgroud)
但我想知道如何像在 C# 类中那样约束它。就像是
// pseudocode
@typeparam T : ICloneable
Run Code Online (Sandbox Code Playgroud)
例如,我需要创建以下组件,允许开发人员传递通用类型的“模型”:
.../GESD.Blazor/共享/GesdTrForm.razor
@typeparam modelType
<EditForm Model="@Model"
OnValidSubmit="@OnValidSubmit"
style="display:table-row"
>
@ChildContent
</EditForm>
@code {
[Parameter]
public RenderFragment ChildContent { get; set; }
[Parameter]
public modelType Model { get; set; } // here is the use of the generic
[Parameter]
public EventCallback<EditContext> OnValidSubmit { get; set; }
void demo () {
var cloned = Model.Clone();
}
}
Run Code Online (Sandbox Code Playgroud)
但在.Clone()我收到以下错误:
“modelType”不包含“Clone”的定义...
我有一个使用 Blazor 服务器端和 Editform 的 crud 操作。除了在编辑现有记录后尝试重置表单时,一切都很好。
当我更改表单控件中的某些内容然后单击重置按钮时,它会关闭表单。我更改的数据已更新到 HTML 表,但未在数据库中更新。
无论如何我可以防止这种情况吗?
这是我的模型:
public class Address
{
public string province { get; set; }
public string address { get; set; }
public string contact_name { get; set; }
public string phone_number { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的编辑表格:
<EditForm Model="@model" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<div class="form-group">
<InputText @bind-Value="@model.province" />
</div>
<div class="form-group">
<InputText @bind-Value="@model.contact_name" />
</div>
<div class="form-group">
<InputText @bind-Value="@model.phone_number" />
</div>
<div class="form-group">
<InputText @bind-Value="@model.address" />
</div>
<button type="submit" class="btn …Run Code Online (Sandbox Code Playgroud) 假设我有一个迭代器:
function* someIterator () {
yield 1;
yield 2;
yield 3;
}
let iter = someIterator();
Run Code Online (Sandbox Code Playgroud)
...我查看下一个要迭代的元素:
let next = iter.next(); // {value: 1, done: false}
Run Code Online (Sandbox Code Playgroud)
...然后我在循环中使用迭代器:
for(let i of iterator)
console.log(i);
// 2
// 3
Run Code Online (Sandbox Code Playgroud)
循环将不包括所查看的元素。我希望看到下一个元素,同时不将其从迭代系列中删除。
换句话说,我希望实现:
let next = peek(iter); // {value: 1, done: false}, or alternatively just 1
for(let i of iterator)
console.log(i);
// 1
// 2
// 3
Run Code Online (Sandbox Code Playgroud)
...而且我不想在不修改可迭代函数的代码的情况下做到这一点。
我的尝试就在我的回答中。它有效(这就是我将其作为答案的原因),但我担心它构建的对象比它必须的更复杂。我担心它不适用于“完成”对象与{ value = undefined, done = true }. 因此,非常欢迎任何改进的答案。