使用"this"的 Blazor 编辑窗体和模型



我正在将我的asp.net应用程序转换为Blazor,我有一个关于使用EditForm和模型的问题。目前,如果我没有一个特定的模型设置为我的表单,我可能只是创建一些变量来绑定我的表单。当我这样做时,我这样做:

<EditForm Model="this">

我知道我不必使用EditForm,但可以使用常规的HTML控件。我想使用基于InputBase的控件,当然我已经创建了一些我自己的控件。

我可能有一个快速表单,其中用户只输入几个字段的数据,如字符串和日期。我没有创建类对象,而是向页面添加两个公共字段,然后创建EditForm,如上所示,其中包含我的字段。

你能告诉我一个好的理由为什么我不应该这样做,或者这是完全可以的吗?

我同意Henk的回答。

如果你只做一些"局部"的事情;那么,为什么不直接将数据放入组件中的局部类中呢?

这是我刚才在别处回答另一个问题时用的形式:

@page "/"
@using System;
@using System.ComponentModel.DataAnnotations;
<h3>EditForm</h3>
@if (loaded)
{
<EditForm EditContext=this.editContext OnValidSubmit=this.OnValidSubmit>
<DataAnnotationsValidator />
<div class="row mb-2">
<div class="col-2">
Name:
</div>
<div class="col-6">
<InputText class="form-control" @bind-Value=this.model.Name />
</div>
<div class="col-4">
<ValidationMessage For="() => this.model.Name" />
</div>
</div>
<div class="row mb-2">
<div class="col-2">
Count:
</div>
<div class="col-6">
<InputNumber class="form-control" @bind-Value=this.model.Count />
</div>
<div class="col-4">
<ValidationMessage For="() => this.model.Count" />
</div>
</div>
<div class="row">
<div class="col-12 text-end">
<button class="btn btn-primary" type="submit">Add Record</button>
</div>
</div>
</EditForm>
}
@code {
private Model model = new Model();
private bool loaded;
private EditContext? _editContext;
private EditContext editContext => _editContext!;
protected async override Task OnInitializedAsync()
{
// emulate an async data get from elsewhere
await Task.Delay(100);
this.model = new Model();
this._editContext = new EditContext(this.model);
loaded = true;
}
private void OnValidSubmit()
{
// my code
}
public class Model
{
[Required]
[StringLength(16, ErrorMessage = "Name too long (16 character limit).")]
public string? Name { get; set; }
[Range(10, 100, ErrorMessage = "Value must be between 10 and 100.")]
public int Count { get; set; }
}
}

从技术上讲,这没有什么问题,正如您将注意到的那样,它运行良好。我有时也用它来做一些非常简单的事情,比如搜索词。

但是在架构级别上,您现在有View == ViewModel。对于较大的数据对象,这是不正确或不实用的。它将更难测试,并且您将不得不在某些时候转换(映射)数据以进行处理。

最新更新