Blazor EditForm 和模型使用 'this'

Blazor EditForm and Model using 'this'

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

<EditForm Model="this">

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

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

你能告诉我一个我不应该这样做的充分理由吗?或者这样做会完全没问题吗?

从技术上讲,这没有任何问题,正如您所注意到的那样,它工作正常。有时我确实会用它来做一些非常简单的事情,比如搜索词。

但是在架构层面上,您现在拥有 View == ViewModel。对于较大的数据对象,这是不正确或不实用的。测试起来会更难,在某些时候你将不得不转换(映射)数据进行处理。

我同意 Henk 的回答。

如果您只是在做一些“本地”的事情,那么为什么不直接将您的数据放入组件中的本地 class?

这是我刚刚在别处回答另一个问题时使用的表格:

@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; }
    }
}