我有这个字段,出于某种原因,当我点击提交时,会收到验证消息,说明该字段是必需的。
[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
}
答案 0 :(得分:94)
MVC中的内置DefaultModelBinder将对值类型(如int,DateTime,decimal等)执行必需和数据类型验证。即使您没有使用类似[Required]
之类的内容明确指定验证,也会发生这种情况。
为了使其成为可选项,您必须将其定义为可为空:
public double? Budget { get; set; }
答案 1 :(得分:7)
double
是一种值类型。值类型始终包含值,即使您未设置值也是如此。该值是其类型的默认值(在本例中为0.0
)。根据框架的要求处理所有值类型。解决这个问题的唯一方法是创建一个自定义模型绑定器,但这不会阻止模型包含默认值(因为没有办法说它没有输入)。
因此,即使您创建自定义活页夹,当您处理模型时,您也无法判断是否有人输入了0
或者这是否只是默认值。
因此,唯一真正的解决方案是将视图模型更改为使用可空类型,例如Nullable<double>
(简写为double?
)。
答案 2 :(得分:2)
您可能会将预算从double
更改为double?
您可以尝试将此属性添加到控制器
BindExclude([Bind(Exclude="Budget")])
以及
答案 3 :(得分:2)
您必须在application_start(global.asax)
中添加以下行DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
来源:Unrequired property keeps getting data-val-required attribute
答案 4 :(得分:0)
使用[NotMapped]注释,这将删除流程中所需的验证,您还使用自己的显示属性
答案 5 :(得分:0)
在属性名称后使用 Nullable 或?。