46

我有这个字段,由于某种原因,当我单击提交时,会收到一条验证消息,表明该字段是必需的。

[DisplayName("Total Budget:")]
public double Budget { get; set; }

@Html.EditorFor(model => model.account.Budget)
@Html.ValidationMessageFor(model => model.account.Budget)

public class Account
{
    [DisplayName("Total Budget:")]
    public double Budget { get; set; } //dropdown
}
4

7 回答 7

109

MVC 中内置的 DefaultModelBinder 将对值类型(如 int、DateTime、decimal 等)执行所需的数据类型验证。即使您没有使用 someting like 明确指定验证,也会发生这种情况[Required]

为了使其可选,您必须将其定义为可为空的:

public double? Budget { get; set; }
于 2012-11-08T16:40:27.633 回答
9

您必须在 application_start (global.asax) 中添加以下行

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

资料来源:Unrequired 属性不断获取 data-val-required 属性

于 2017-04-21T14:49:46.703 回答
8

double是一个值类型。值类型总是包含一个值,即使您没有设置一个值。该值是其类型的默认值(在本例中0.0)。所有值类型都按照框架的要求进行处理。解决这个问题的唯一方法是创建一个自定义模型绑定器,但这不会阻止模型包含默认值(因为无法说它没有被输入)。

因此,即使您创建了自定义活页夹,当您处理模型时,您也无法判断是否有人输入0,或者这是否只是默认值。

因此,唯一真正的解决方案是将您的视图模型更改为使用可为空的类型,例如Nullable<double>(简写为double?)。

于 2012-11-08T16:49:35.107 回答
2

您可能将预算从 a 更改doubledouble?

您可能可以尝试将此属性添加到控制器

BindExclude([Bind(Exclude="Budget")])以及

于 2012-11-08T16:32:54.123 回答
2

使用Nullable? 在属性名称之后。

于 2018-02-19T08:54:10.323 回答
0

使用 [NotMapped] 注释,这将删除流程中所需的验证,您还可以使用自己的显示属性

于 2018-02-15T14:28:14.663 回答
0

我刚刚遇到一个项目迁移到 .Net 6.0 的问题,突然有些字段开始需要,即使它没有数据注释。

例如,在

public class LoginModel
{
    [BindProperty]
    public InputModel Input { get; set; }

    [TempData]
    public string ErrorMessage { get; set; }
    ...
}

我收到错误消息:“ErrorMessage 字段是必需的”,这当然毫无意义。

该项目已<Nullable>enable</Nullable>启用功能,这似乎是造成这种情况的原因。

只需将属性重写为

 public string? ErrorMessage { get; set; }

解决这个问题(注意问号)

于 2022-02-03T16:03:26.183 回答