我有一个blazor服务器大小应用程序,其中编辑形式内有一个编辑形式. 看起来是这样的:

<EditForm Model=@newPerson Context="PersonForm" OnValidSubmit="@FormSubmitted">
    <ValidationSummary />
    <div class="form-row">
        <h4>Staff Information</h4>
    </div>
    <div class="form-row">
        <div class="form-group col-md-2">
            <label for="ResourceId">Person Id</label>
            <InputText @bind-Value=newPerson.ResourceId class="form-control" id="ResourceId" />
        </div>
        <div class="form-group col-md-2">
            <label for="Title">Title</label>
            <InputText @bind-Value=newPerson.Title class="form-control" id="Title" />
        </div>
        <div class="form-group col-md-2">
            <label for="Forename">Forename</label>
            <InputText @bind-Value=newPerson.Forename class="form-control" id="Forename" />
        </div>
        <div class="form-group col-md-2">
            <label for="Surname">Surname</label>
            <InputText @bind-Value=newPerson.Surname class="form-control" id="Surname" readonly />
        </div>
    </div>
    <EditForm Model=@newPos OnValidSubmit="@AddPosition">
        <DataAnnotationsValidator />
        <ValidationSummary />
        <div class="form-row">
            <h4>Position</h4>
        </div>
        <div class="form-row">
            <div class="form-group col-md-2">
                <label for="newPositionId">Position Id</label>
                <InputText @bind-Value=newPos.PositionId class="form-control" id="newPositionId" />
            </div>
            <div class="form-group col-md-2">
                <label for="newPositionName">Position Name</label>
                <InputText @bind-Value=newPos.PositionName class="form-control" id="newPositionName" />
            </div>
        </div>
        <input type="submit" class="btn btn-primary" value="Add Additional Position" />
    </EditForm>
    <br />
    <input type="submit" class="btn btn-primary form-group mr-1" value="Save Person" />
    <hr />
</EditForm>

这些表格的模型包括:

public class Person
    {

        [Required]
        public string ResourceId { get; set; }
        [Required]
        public string Title { get; set; }
        [Required]
        public string Forename { get; set; }
        [Required]
        public string Surname { get; set; }
        public List<Position> Positions { get; set; }
    }
public class Position
    {
        [Required]
        public string PositionId { get; set; }
        [Required]
        public string PositionName { get; set; }
     }

这些表格调用的提交方法包括:

void AddPosition(EditContext editContext)
    {
        bool formIsValid = editContext.Validate();
        if (formIsValid == true)
        {            
            newPerson.Positions.Add(newPos);
            newPos = new Position();
            //JsRuntime.InvokeVoidAsync("alert", "Position added.  Click submit to add another.");           
        }
    }
void FormSubmitted(EditContext editContext)
    {
        bool formIsValid = editContext.Validate();
        if (formIsValid == true)
        {
            newHr.Positions.Add(newPos);



            OnInitializedAsync();
        }
    }

这允许我将多个职位添加到人员记录中,并且这样做时,表单将正确验证,但是在保存顶级表单(人员)时,它将正确验证人员,但忽略子表单(职位)上的验证. 这样我就可以在提交表格时将无效数据添加到人员记录中,因为职位中包含空数据.

当使用FormSubmitted方法提交主编辑表单时,是否可以验证子编辑表单?

我try 过向模型添加各种验证,并向人员模型内的位置添加[必需]标签,但这不起作用. 我还try 调整编辑表格上的子上下文. 我try 让AddStatus表单将其验证传递给主表单,但根本无法让它起作用. 我考虑过使用外部验证nuget包,但如果可能的话,我最好使用原生blazor来完成这一任务.

推荐答案

我们可以在外部表单中使用OnSubmit,并在外部表单和内部表单上手动进行验证.

<EditForm Model=@newPerson Context="PersonForm" OnSubmit="@FormSubmitted">
    <DataAnnotationsValidator />
    <ValidationSummary />
    <div class="form-row">
        <h4>Staff Information</h4>
    </div>
    <div class="form-row">
        <div class="form-group col-md-2">
            <label for="ResourceId">Person Id</label>
            <InputText @bind-Value=newPerson.ResourceId class="form-control" id="ResourceId" />
        </div>
        <div class="form-group col-md-2">
            <label for="Title">Title</label>
            <InputText @bind-Value=newPerson.Title class="form-control" id="Title" />
        </div>
    </div>
    <EditForm  EditContext="@EC" OnValidSubmit="@AddPosition">
        <DataAnnotationsValidator />
        <ValidationSummary />
        <div class="form-row">
            <h4>Position</h4>
        </div>
        <div class="form-row">
            <div class="form-group col-md-2">
                <label for="newPositionId">Position Id</label>
                <InputText @bind-Value=newPos.PositionId class="form-control" id="newPositionId" />
            </div>
            <div class="form-group col-md-2">
                <label for="newPositionName">Position Name</label>
                <InputText @bind-Value=newPos.PositionName class="form-control" id="newPositionName" />
            </div>
        </div>
        <input type="submit" class="btn btn-primary" value="Add Additional Position" />
    </EditForm>
    <br />
    <input type="submit" class="btn btn-primary form-group mr-1" value="Save Person" />
    <hr />
</EditForm>

@code {
    private Person newPerson = new ();
    private Position newPos = new ();
    private EditContext EC { get; set; }
 


    protected override async Task OnInitializedAsync()
    {
        EC = new EditContext(newPos);
    }

    void AddPosition(EditContext editContext)
    {
        bool formIsValid = editContext.Validate();
        if (formIsValid == true)
        {
            newPerson.Positions.Add(newPos);
            newPos = new Position();
        }
    }

    void FormSubmitted(EditContext editContext)
    {
        bool personFormIsValid = editContext.Validate();
        bool formIsValid = EC.Validate();
        if (formIsValid == true)
        {
            OnInitializedAsync();
        }
    }
}

enter image description here

Csharp相关问答推荐

.NET通过版本自动增量设置包版本

在实际上是List T的 IESEARCH上多次调用First()是否不好?

如何保持主摄像头视角保持一致?

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

MAUI查询参数单一字符串项将不起作用

(乌龙)1&#比c#中的UL&#慢吗?

.NET HttpClient、JsonSerializer或误用的Stream中的内存泄漏?

S能够用DATETIME来计算,这有什么错呢?

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

ASP.NET Core AutoMapper:如何解决错误 CS0121调用在以下方法或属性之间不明确

我如何让我的秒表保持运行场景而不重置

正在try 从Blazor中的API读取JSON

GODOT 4向C#中的字符串参数发送信号以等待

如何在不复制或使用输出的情况下定义项目依赖

解决方案:延长ABP框架和ANGING OpenIddict中的令牌生命周期

C#如何获取字符串中引号之间的文本?

用MongoDB c#驱动程序删除和返回嵌套数组中的文档

Visual Studio,Docker容器-容器调用:连接被拒绝

从GRPC连接创建ZipArchive

如何在特定时间间隔运行多个后台任务?