即使没有定义,表单字段也是必需的

Form field is required even if not defined so

我正在使用带有 Fluent Validation 的 Net 6,并且我有一个包含以下字段的表单:

  <form method="post" asp-controller="Product" asp-action="Create" asp-antiforgery="true" autocomplete="off">
    <label asp-for="Description">Description</label>
    <input asp-for="Description" type="text"> 
    <span asp-validation-for="Description" class="error"></span>
    ...
    <button class="submit" name="button">Create</button>   
  </form>

ProductModel是:

public class ProductModel {

  public String Description { get; set; }

  // ...
}

ProductModel Fluent Validator 是:

public class 模型验证器:抽象验证器 {

public ModelValidator() {

  RuleFor(x => x.Description)
    .Length(0, 200).WithMessage("Do not exceed 200 characters");

  // ...

} 

}

当我提交表单时,如果我将其留空,则会出现描述错误:

The Description field is required.

但是我的验证器不需要描述。

这发生在所有领域。未填写时,我会收到类似的错误。

我错过了什么?

做了一点挖掘,这似乎是由于与模型验证更改相关的问题;特别是在 ASP Net 6 中。我找到了一个文档 link 可以比我更好地解释它,但我也会给出一个代码实现:Microsoft docs

builder.Services.AddControllers(
    options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true);

//Removes the required attribute for non-nullable reference types.

希望这对您有所帮助,我直接从 MS 文档中获取了这段代码,因此如果它不能解决您的问题,可能还有其他原因。

这里是MC文档中关于这个问题的非常详细的解释:

Gets or sets a value that determines if the inference of RequiredAttribute for properties and parameters of non-nullable reference types is suppressed. If false (the default), then all non-nullable reference types will behave as-if [Required] has been applied. If true, this behavior will be suppressed; nullable reference types and non-nullable reference types will behave the same for the purposes of validation.

解决这个问题有两种方法,一种是全局的,一种是局部的。

您可以设置:

builder.Services.AddControllersWithViews(options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true)

在你的Program.cs(.Net6)中,使用此方法后,所有属性都可以为null。

另一种方法在您的模型中,您可以像这样设置属性:

public class ProductModel {

  public String? Description { get; set; }

  // ...
}

?表示这个属性可以为null,在这个方法中,可以指定哪些属性可以为null。